posts - 19, comments - 53, trackbacks - 0, articles - 283
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          控制流結(jié)構(gòu)——case

          Posted on 2009-11-29 12:05 Gavin.lee 閱讀(308) 評論(0)  編輯  收藏 所屬分類: Linux shell 入門

           

          case語句
          case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執(zhí)行相匹配的命令。case語句格式如下:
          Shell代碼
          1. case 值 in   
          2. 模式1 )   
          3.   命令1  
          4.   . . .   
          5.   ;;   
          6. 模式2 )   
          7.   命令2  
          8.   . . .   
          9.   ;;   
          10. esac  


          case工作方式如上所示。取值后面必須為單詞 in,每一模式必須以右括號結(jié)束。取值可以為變量或常數(shù)。匹配發(fā)現(xiàn)取值符合某一模式后,其間所有命令開始執(zhí)行直至;;

          取值將檢測匹配的每一個模式。一旦模式匹配,則執(zhí)行完匹配模式相應(yīng)命令后不再繼續(xù)其他模式。如果無一匹配模式,使用星號*捕獲該值,再接受其他輸入。模式部分可能包括元字符,與在命令行文件擴(kuò)展名例子中使用過的匹配模式類型相同,即:
          * 任意字符。
          任意單字符。
          [..] 類或范圍中任意字符。

          來看一個簡單的case語句:
          Shell代碼
          1. /home/l/g/tomotoboy >cat caseselect   
          2. #!/bin/sh   
          3. #caseselect   
          4. echo - n "Enter a number from 1 to 5 :"  
          5. read ANS   
          6.  case $ANS in   
          7. 1) echo "you select 1"  
          8. ;;   
          9. 2) echo "you select 2"  
          10. ;;   
          11. 3) echo "you select 3"  
          12. ;;   
          13. 4) echo "you select 4"  
          14. ;;   
          15. 5) echo "you select 5"  
          16. ;;   
          17. *) echo "`basename $0`: This is not between 1 and 5" >&2  
          18. ;;   
          19. esac   
          20.   
          21. /home/l/g/tomotoboy >caseselect   
          22. - n Enter a number from 1 to 5 :   
          23. 4  
          24. you select 4  
          25. /home/l/g/tomotoboy >caseselect   
          26. - n Enter a number from 1 to 5 :   
          27. 7  
          28. caseselect: This is not between 1 and 5  


          對匹配模式使用|
          Shell代碼
          1. /home/l/g/tomotoboy >cat caseterm   
          2. #!/bin/sh   
          3. #caseterm   
          4. echo "choices are.. vt100, vt102, vt220"  
          5. echo -n "enter your terminal type :"  
          6. read TERMINAL   
          7.  case $TERMINAL in   
          8.  vt100|vt102) TERM=vt100   
          9.  ;;   
          10.  vt220) TERM=vt220   
          11.  ;;   
          12.  *) echo "`basename $0`: Unknown reponse" >&2  
          13.    echo "setting it to vt100 anyway,so there"  
          14.    TERM=vt100   
          15.  ;;   
          16. esac   
          17. export TERM   
          18. echo "Your terminal is set to $TERM'   
          19. "caseterm" 17 lines, 348 characters   
          20.   
          21. /home/l/g/tomotoboy >caseterm   
          22. choices are.. vt100, vt102, vt220   
          23. -n enter your terminal type :   
          24. vt100   
          25. 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),用戶退出腳本。
          Shell代碼
          1. /home/l/g/tomotoboy >cat caseans   
          2. #!/bin/sh   
          3. #caseans   
          4. echo -n "Do you wish to proceed [y..n]"  
          5. read ANS   
          6.  case $ANS in   
          7.  y|Y|yes|Yes) echo "yes is selected"  
          8.  ;;   
          9.  n|N|no|No) echo "no is selectd"  
          10.  ;;   
          11.  *) echo "`basename $0` : Unknown response" >&2  
          12.  ;;   
          13.  esac   
          14.   
          15. /home/l/g/tomotoboy >caseans   
          16. -n Do you wish to proceed [y..n]   
          17. y   
          18. yes is selected  


          case與命令參數(shù)傳入
          Shell代碼
          1. /home/l/g/tomotoboy >cat >> caseparam   
          2. #!/bin/sh   
          3. #caseparam   
          4. if [ $# != 1 ];then   
          5.    echo "Usage:`basename $0` [start|stop|help]" >&2  
          6. fi   
          7. OPT=$1  
          8. case $OPT in   
          9.  start) echo "starting..`basename $0`"  
          10. ;;   
          11.  stop) echo "stopping..`basename $0`"  
          12. ;;   
          13.  help) echo "stopping..`basename $0`"  
          14.  echo "Usage:`basename $0` [start|stop|help]"  
          15. ;;   
          16.  *) echo "stopping..`basename $0`"  
          17.  echo "Usage:`basename $0` [start|stop|help]"  
          18. ;;   
          19. esac   
          20. /home/l/g/tomotoboy >chmod u+x caseparam   
          21. /home/l/g/tomotoboy >caseparam help   
          22. stopping..caseparam   
          23. Usage:caseparam [start|stop|help]   
          24. /home/l/g/tomotoboy >caseparam start   
          25. 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語句末尾顯示有效的部門號和報表類型。腳本如下:
          Shell代碼
          1. #!/bin/sh   
          2. # casevalid   
          3. echo -n "enter the account dept No: "  
          4. read ACC   
          5.  case $ACC in   
          6.       234);;   
          7.       453);;   
          8.       655);;   
          9.       454);;   
          10.          *) echo "basename $01`: Unknon dept No"  
          11.               echo "try..234,453,655,454"  
          12.               exit 1  
          13.               ;;   
          14. esac   
          15. #if we are here, then we have a validdated the dept no   
          16. echo " 1 . post"  
          17. echo " 2 . prior"  
          18. echo -n "enter the type of report: "  
          19. read ACC_TYPE   
          20.    case $ACC_TYPE in   
          21.    1)TYPE=post;;   
          22.    2)TYPE=prior;;   
          23.    *) echo "`basename $0`: Unknown account type." >&2  
          24. "casevalid" 29 lines, 665 characters   
          25. /home/l/g/tomotoboy >casevalid   
          26. -n enter the account dept No:   
          27. 454  
          28.  1 . post   
          29.  2 . prior   
          30. -n enter the type of report:   
          31. 1  
          32. now running report for dept 454 for the type post  
          主站蜘蛛池模板: 江山市| 仁怀市| 萨迦县| 长岭县| 博湖县| 芦溪县| 鄂伦春自治旗| 南宫市| 康乐县| 苗栗县| 怀来县| 都昌县| 金山区| 柘荣县| 铜陵市| 密山市| 营口市| 涿州市| 通榆县| 焉耆| 油尖旺区| 长岭县| 图木舒克市| 甘谷县| 南澳县| 黄浦区| 从江县| 桦甸市| 夹江县| 杭锦后旗| 浪卡子县| 延寿县| 哈巴河县| 枣庄市| 石嘴山市| 女性| 磐安县| 清远市| 陆丰市| 洞口县| 吉木萨尔县|