case語句
case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執(zhí)行相匹配的命令。case語句格式如下:
case工作方式如上所示。取值后面必須為單詞 in,每一模式必須以右括號結(jié)束。取值可以為變量或常數(shù)。匹配發(fā)現(xiàn)取值符合某一模式后,其間所有命令開始執(zhí)行直至;;
取值將檢測匹配的每一個模式。一旦模式匹配,則執(zhí)行完匹配模式相應(yīng)命令后不再繼續(xù)其他模式。如果無一匹配模式,使用星號*捕獲該值,再接受其他輸入。模式部分可能包括元字符,與在命令行文件擴(kuò)展名例子中使用過的匹配模式類型相同,即:
來看一個簡單的case語句:
對匹配模式使用|
提示鍵入y或n
case的一個有效用法是提示用戶響應(yīng)以決定是否繼續(xù)進(jìn)程。這里提示輸入y以繼續(xù)處理n退出。如果用戶輸入Y、y或yes,處理繼續(xù)執(zhí)行case語句后面部分。如果用戶輸入N、n或no或其他響應(yīng),用戶退出腳本。
case與命令參數(shù)傳入
捕獲輸入并執(zhí)行空命令
不一定要在匹配模式后加入命令,如果你原本不想做什么,只是在進(jìn)一步處理前過濾出意外響應(yīng),這樣做是一種好辦法。如果要運(yùn)行對應(yīng)于一個會計部門的帳目報表,必須首先在決定運(yùn)行報表的類型前確認(rèn)用戶輸入一個有效的部門號,匹配所有可能值,其他值無效。用case可以很容易實現(xiàn)上述功能。下面的腳本中如果用戶輸入部門號不是234、453、655或454,用戶退出并返回可用信息。一旦響應(yīng)了用戶的有效部門號,腳本應(yīng)用同樣的技術(shù)取得報表類型,在case語句末尾顯示有效的部門號和報表類型。腳本如下:
case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執(zhí)行相匹配的命令。case語句格式如下:
- case 值 in
- 模式1 )
- 命令1
- . . .
- ;;
- 模式2 )
- 命令2
- . . .
- ;;
- esac
case工作方式如上所示。取值后面必須為單詞 in,每一模式必須以右括號結(jié)束。取值可以為變量或常數(shù)。匹配發(fā)現(xiàn)取值符合某一模式后,其間所有命令開始執(zhí)行直至;;
取值將檢測匹配的每一個模式。一旦模式匹配,則執(zhí)行完匹配模式相應(yīng)命令后不再繼續(xù)其他模式。如果無一匹配模式,使用星號*捕獲該值,再接受其他輸入。模式部分可能包括元字符,與在命令行文件擴(kuò)展名例子中使用過的匹配模式類型相同,即:
* | 任意字符。 |
? | 任意單字符。 |
[..] | 類或范圍中任意字符。 |
來看一個簡單的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 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īng)以決定是否繼續(xù)進(jìn)程。這里提示輸入y以繼續(xù)處理n退出。如果用戶輸入Y、y或yes,處理繼續(xù)執(zhí)行case語句后面部分。如果用戶輸入N、n或no或其他響應(yīng),用戶退出腳本。
- /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與命令參數(shù)傳入
- /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
捕獲輸入并執(zhí)行空命令
不一定要在匹配模式后加入命令,如果你原本不想做什么,只是在進(jìn)一步處理前過濾出意外響應(yīng),這樣做是一種好辦法。如果要運(yùn)行對應(yīng)于一個會計部門的帳目報表,必須首先在決定運(yùn)行報表的類型前確認(rèn)用戶輸入一個有效的部門號,匹配所有可能值,其他值無效。用case可以很容易實現(xiàn)上述功能。下面的腳本中如果用戶輸入部門號不是234、453、655或454,用戶退出并返回可用信息。一旦響應(yīng)了用戶的有效部門號,腳本應(yīng)用同樣的技術(shù)取得報表類型,在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