case $1 in
-f)
... 針對-f玄子昂的程序代碼
;;
-d | --directory) #允許長選項(xiàng)
... 針對-d選項(xiàng)的程序代碼
;;
*)
echo $1:unkonw option >$2
exit 1
#在esac之前的;;形式是一個(gè)好習(xí)慣,不過并非必要
esac
這里我們看到,要測試的值出現(xiàn)在 case 和 in 之間.將值以雙引號括起來并非必要,但也無妨.要測試的值,根據(jù) shell 模式的列別一次測試,返現(xiàn)匹配的時(shí)候,便執(zhí)行相對應(yīng)的程序代碼,直至;;為止.可以使用多個(gè)模式,只要| 字符加以分割即可.這種情況稱為”or(或)”.模式里會包含任何的 shell 統(tǒng)配字符,且變量,命令與算數(shù)替換會在它用作模式匹配之前在此值上被終止.
可能會覺得每個(gè)模式列表之后的部隊(duì)稱的右圓括號有點(diǎn)奇怪,不過這也是 shell 于艷麗部隊(duì)稱定界符的位移實(shí)例.
最后的*模式視窗通用發(fā),但是非必須的,他作為一個(gè)默認(rèn)的情況.這通常實(shí)在你要現(xiàn)實(shí)診斷信息并退出時(shí)使用.最后一個(gè)情況不再需要結(jié)尾的;;,不過加上他,會是比較好的形式
案例:提示輸入 1 到 4,與每一種模式進(jìn)行匹配
bash 代碼:
echo 'input your a number 1 to4'
echo 'your number is : \n'
read aNum
case $aNum in
1)echo 'number 1'
;;
2)echo 'number 2'
;;
3)echo 'number 3'
;;
4)echo 'number 4'
;;
*)echo 'number default'
;;
esac
案例二:判斷輸入文件是文件還是目錄
option="${1}"
case ${option} in
-f) file="${2}"
echo "file name is $file"
;;
-d) dir="${2}"
echo "dir name is $dir"
;;
*)echo "basename ${0} :usage:[-f file ]| [-d directory]"
exit 1
;;
esac
案例三:
bash代碼;
#!/bin/bash
name='basename $0 .sh'
case $1 in
s|start) echo "start..."
;;
stop) echo "stop ..."
;;
reload)echo "reload..."
;;
*)echo "Usage: $name [start|stop|reload]"
exit 1
;;
esac
注意:1、 ) 相當(dāng)于其他語言中的 default。
2、除了)模式,各個(gè)分支中;;是必須的,;;相當(dāng)于其他語言中的 break
3、 | 分割多個(gè)模式,相當(dāng)于 or
復(fù)習(xí)一下變量說明:
|
變量 |
作用 |
|
$$ |
shell本身的PID(ProcessID) |
|
$! |
sehll最后運(yùn)行運(yùn)行的后臺Process的PID |
|
$? |
最后運(yùn)行的命令的結(jié)束代碼(返回值) |
|
$- |
使用set命令設(shè)定的Flag一覽 |
|
$* |
所有參數(shù)列表.如”$*”用圓括號括起來,以”$1?$2?...$n”的行為輸出所有參數(shù) |
|
$@ |
所有參數(shù)列表,如果”$@”用圓括號括起來,以”$1”?“$2”?“$n”的形式輸出所有參數(shù) |
|
$# |
添加到shell的參數(shù)個(gè)數(shù) |
|
$0 |
shell本身的文件名 |
|
$1~$n |
添加到sehll的各參數(shù)值.$1是第一個(gè)參數(shù),$2是第二個(gè)參數(shù),以此類推 |
案例:
printf "The complete list is %s\n" "$$"
結(jié)果:The complete list is 1567