无线&移动互联网技术研发

换位思考·····
posts - 19, comments - 53, trackbacks - 0, articles - 283
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

控制流结构——case

Posted on 2009-11-29 12:05 Gavin.lee 阅读(289) 评论(0)  编辑  收藏 所属分类: Linux shell 入门

 

case语句
case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
Shell代码
  1. case 值 in   
  2. 模式1 )   
  3.   命令1  
  4.   . . .   
  5.   ;;   
  6. 模式2 )   
  7.   命令2  
  8.   . . .   
  9.   ;;   
  10. esac  


case工作方式如上所示。取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号*捕获该值,再接受其他输入。模式部分可能包括元字符,与在命令行文件扩展名例子中使用过的匹配模式类型相同,即:
* 任意字符。
任意单字符。
[..] 类或范围中任意字符。

来看一个简单的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以继续处理n退出。如果用户输入Y、y或yes,处理继续执行case语句后面部分。如果用户输入N、n或no或其他响应,用户退出脚本。
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与命令参数传入
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  


捕获输入并执行空命令
不一定要在匹配模式后加入命令,如果你原本不想做什么,只是在进一步处理前过滤出意外响应,这样做是一种好办法。如果要运行对应于一个会计部门的帐目报表,必须首先在决定运行报表的类型前确认用户输入一个有效的部门号,匹配所有可能值,其他值无效。用case可以很容易实现上述功能。下面的脚本中如果用户输入部门号不是234、453、655或454,用户退出并返回可用信息。一旦响应了用户的有效部门号,脚本应用同样的技术取得报表类型,在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  

只有注册用户登录后才能发表评论。


网站导航: