case語句
case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。case語句格式如下:
- case 值 in
- 模式1 )
- 命令1
- . . .
- ;;
- 模式2 )
- 命令2
- . . .
- ;;
- esac
case 值 in
模式1 )
命令1
. . .
;;
模式2 )
命令2
. . .
;;
esac
case工作方式如上所示。取值后面必須為單詞 in,每一模式必須以右括號結束。取值可以為變量或常數。匹配發現取值符合某一模式后,其間所有命令開始執行直至;;
取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令后不再繼續其他模式。如果無一匹配模式,使用星號*捕獲該值,再接受其他輸入。模式部分可能包括元字符,與在命令行文件擴展名例子中使用過的匹配模式類型相同,即:
* |
任意字符。 |
? |
任意單字符。 |
[..] |
類或范圍中任意字符。 |
來看一個簡單的case語句:
- /home/l/g/tomotoboy >cat caseselect
- #!/bin/sh
- #caseselect
- echo - n "Enter a number from 1 to 5 :"
- read ANS
- case $ANS in
- 1) echo "you select 1"
- ;;
- 2) echo "you select 2"
- ;;
- 3) echo "you select 3"
- ;;
- 4) echo "you select 4"
- ;;
- 5) echo "you select 5"
- ;;
- *) echo "`basename $0`: This is not between 1 and 5" >&2
- ;;
- esac
-
- /home/l/g/tomotoboy >caseselect
- - n Enter a number from 1 to 5 :
- 4
- you select 4
- /home/l/g/tomotoboy >caseselect
- - n Enter a number from 1 to 5 :
- 7
- caseselect: This is not between 1 and 5
/home/l/g/tomotoboy >cat caseselect
#!/bin/sh
#caseselect
echo - n "Enter a number from 1 to 5 :"
read ANS
case $ANS in
1) echo "you select 1"
;;
2) echo "you select 2"
;;
3) echo "you select 3"
;;
4) echo "you select 4"
;;
5) echo "you select 5"
;;
*) echo "`basename $0`: This is not between 1 and 5" >&2
;;
esac
/home/l/g/tomotoboy >caseselect
- n Enter a number from 1 to 5 :
4
you select 4
/home/l/g/tomotoboy >caseselect
- n Enter a number from 1 to 5 :
7
caseselect: This is not between 1 and 5
對匹配模式使用|
- /home/l/g/tomotoboy >cat caseterm
- #!/bin/sh
- #caseterm
- echo "choices are.. vt100, vt102, vt220"
- echo -n "enter your terminal type :"
- read TERMINAL
- case $TERMINAL in
- vt100|vt102) TERM=vt100
- ;;
- vt220) TERM=vt220
- ;;
- *) echo "`basename $0`: Unknown reponse" >&2
- echo "setting it to vt100 anyway,so there"
- TERM=vt100
- ;;
- esac
- export TERM
- echo "Your terminal is set to $TERM'
- "caseterm" 17 lines, 348 characters
-
- /home/l/g/tomotoboy >caseterm
- choices are.. vt100, vt102, vt220
- -n enter your terminal type :
- vt100
- Your terminal is set to vt100'
/home/l/g/tomotoboy >cat caseterm
#!/bin/sh
#caseterm
echo "choices are.. vt100, vt102, vt220"
echo -n "enter your terminal type :"
read TERMINAL
case $TERMINAL in
vt100|vt102) TERM=vt100
;;
vt220) TERM=vt220
;;
*) echo "`basename $0`: Unknown reponse" >&2
echo "setting it to vt100 anyway,so there"
TERM=vt100
;;
esac
export TERM
echo "Your terminal is set to $TERM'
"caseterm" 17 lines, 348 characters
/home/l/g/tomotoboy >caseterm
choices are.. vt100, vt102, vt220
-n enter your terminal type :
vt100
Your terminal is set to vt100'
提示鍵入y或n
case的一個有效用法是提示用戶響應以決定是否繼續進程。這里提示輸入y以繼續處理n退出。如果用戶輸入Y、y或yes,處理繼續執行case語句后面部分。如果用戶輸入N、n或no或其他響應,用戶退出腳本。
- /home/l/g/tomotoboy >cat caseans
- #!/bin/sh
- #caseans
- echo -n "Do you wish to proceed [y..n]"
- read ANS
- case $ANS in
- y|Y|yes|Yes) echo "yes is selected"
- ;;
- n|N|no|No) echo "no is selectd"
- ;;
- *) echo "`basename $0` : Unknown response" >&2
- ;;
- esac
-
- /home/l/g/tomotoboy >caseans
- -n Do you wish to proceed [y..n]
- y
- yes is selected
/home/l/g/tomotoboy >cat caseans
#!/bin/sh
#caseans
echo -n "Do you wish to proceed [y..n]"
read ANS
case $ANS in
y|Y|yes|Yes) echo "yes is selected"
;;
n|N|no|No) echo "no is selectd"
;;
*) echo "`basename $0` : Unknown response" >&2
;;
esac
/home/l/g/tomotoboy >caseans
-n Do you wish to proceed [y..n]
y
yes is selected
case與命令參數傳入
- /home/l/g/tomotoboy >cat >> caseparam
- #!/bin/sh
- #caseparam
- if [ $# != 1 ];then
- echo "Usage:`basename $0` [start|stop|help]" >&2
- fi
- OPT=$1
- case $OPT in
- start) echo "starting..`basename $0`"
- ;;
- stop) echo "stopping..`basename $0`"
- ;;
- help) echo "stopping..`basename $0`"
- echo "Usage:`basename $0` [start|stop|help]"
- ;;
- *) echo "stopping..`basename $0`"
- echo "Usage:`basename $0` [start|stop|help]"
- ;;
- esac
- /home/l/g/tomotoboy >chmod u+x caseparam
- /home/l/g/tomotoboy >caseparam help
- stopping..caseparam
- Usage:caseparam [start|stop|help]
- /home/l/g/tomotoboy >caseparam start
- starting..caseparam
/home/l/g/tomotoboy >cat >> caseparam
#!/bin/sh
#caseparam
if [ $# != 1 ];then
echo "Usage:`basename $0` [start|stop|help]" >&2
fi
OPT=$1
case $OPT in
start) echo "starting..`basename $0`"
;;
stop) echo "stopping..`basename $0`"
;;
help) echo "stopping..`basename $0`"
echo "Usage:`basename $0` [start|stop|help]"
;;
*) echo "stopping..`basename $0`"
echo "Usage:`basename $0` [start|stop|help]"
;;
esac
/home/l/g/tomotoboy >chmod u+x caseparam
/home/l/g/tomotoboy >caseparam help
stopping..caseparam
Usage:caseparam [start|stop|help]
/home/l/g/tomotoboy >caseparam start
starting..caseparam
捕獲輸入并執行空命令
不一定要在匹配模式后加入命令,如果你原本不想做什么,只是在進一步處理前過濾出意外響應,這樣做是一種好辦法。如果要運行對應于一個會計部門的帳目報表,必須首先在決定運行報表的類型前確認用戶輸入一個有效的部門號,匹配所有可能值,其他值無效。用case可以很容易實現上述功能。下面的腳本中如果用戶輸入部門號不是234、453、655或454,用戶退出并返回可用信息。一旦響應了用戶的有效部門號,腳本應用同樣的技術取得報表類型,在case語句末尾顯示有效的部門號和報表類型。腳本如下:
- #!/bin/sh
- # casevalid
- echo -n "enter the account dept No: "
- read ACC
- case $ACC in
- 234);;
- 453);;
- 655);;
- 454);;
- *) echo "basename $01`: Unknon dept No"
- echo "try..234,453,655,454"
- exit 1
- ;;
- esac
- #if we are here, then we have a validdated the dept no
- echo " 1 . post"
- echo " 2 . prior"
- echo -n "enter the type of report: "
- read ACC_TYPE
- case $ACC_TYPE in
- 1)TYPE=post;;
- 2)TYPE=prior;;
- *) echo "`basename $0`: Unknown account type." >&2
- "casevalid" 29 lines, 665 characters
- /home/l/g/tomotoboy >casevalid
- -n enter the account dept No:
- 454
- 1 . post
- 2 . prior
- -n enter the type of report:
- 1
- now running report for dept 454 for the type post