`
tomotoboy
  • 浏览: 162400 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

控制流结构——case

阅读更多
case语句
case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
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 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


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


捕获输入并执行空命令
不一定要在匹配模式后加入命令,如果你原本不想做什么,只是在进一步处理前过滤出意外响应,这样做是一种好办法。如果要运行对应于一个会计部门的帐目报表,必须首先在决定运行报表的类型前确认用户输入一个有效的部门号,匹配所有可能值,其他值无效。用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


分享到:
评论

相关推荐

    C#全能速查宝典

    1.4.7 DateTime结构——表示时间上的一刻 50 1.4.8 DAY函数——返回日期部分的整数 51 1.4.9 DayOfWeek属性——获取星期几 52 1.4.10 Equals方法——比较两个字符串对象 53 1.4.11 First函数——返回查询结果的第一...

    软件工程—填空题.docx

    答案:数据流 4. 成本——效益分析的目的是从____角度评价开发一个新的软件项目是否可行。答案:经济 5. 模块有四个基本属性,其中反映它的内部特性的是____。答案:逻辑 6. 确认测试可以发现软件系统是否符合用户的...

    计算机二级公共基础知识

    算法的3种基本控制结构是:顺序结构、选择结构、循环结构。 (4)算法基本设计方法 算法基本设计方法:列举法、归纳法、递推、递归、减半递推技术、回溯法。 (5)指令系统 所谓指令系统指的是一个计算机系统能执行...

    程序设计语言编译原理 (陈火旺)

    7.5.1控制流语句 7.5.2标号与goto语句 7.5.3CASE语句的翻译 7.6过程调用的处理 7.7类型检查 7.7.1类型系统 7.7.2类型检查器的规格说明 7.7.3函数和运算符的重载 7.7.4多态函数 练 习 第八章符号表 8.1...

    javaSE代码实例

    第4章 流程控制——Java世界的航行舵手 42 4.1 if条件语句 42 4.1.1 简略形式 42 4.1.2 完全形式 43 4.1.3 语句的嵌套 43 4.2 switch多分支语句 45 4.2.1 基本语法 45 4.2.2 合法的判断表达式 46 ...

    Java开发技术大全 电子版

    2.5.1三种基本控制结构58 2.5.2表达式语句和空语句59 2.5.3块语句60 2.5.4if~else分支语句61 2.5.5多路分支switch~case语句69 2.5.6当型循环while语句71 2.5.7直到型循环do~while语句72 2.5.8当型循环for...

    计算流体动力学分析 王福军主编

    二、流体的黏性——牛顿流体与非牛顿流体 三、流体的压缩性——可压缩与不可压缩流体 四、液体的表面张力 第二节 流体力学中的力与压强 一、质量力与表面力 二、绝对压强、相对压强与真空度 三、液体的汽化压强 四、...

    SQL Server 2008编程入门经典(第3版)

    11.5 控制流语句 11.5.1 IFELSE语句 11.5.2 CASE语句 11.5.3 用WHILE语句进行循环 11.5.4 WAITOR语句 11.5.5 TRY/CATCH块 11.6 本章小结 11.7 练习 第12章 存储过程 12.1 创建存储过程:基本语法 12.2 使用ALTER...

    asp.net知识库

    根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的存储过程 直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件...

    SQL.Server.2008编程入门经典(第3版).part1.rar

    11.5 控制流语句 11.5.1 IFELSE语句 11.5.2 CASE语句 11.5.3 用WHILE语句进行循环 11.5.4 WAITOR语句 11.5.5 TRY/CATCH块 11.6 本章小结 11.7 练习 第12章 存储过程 12.1 创建存储过程:基本语法 12.2 使用ALTER...

    SQL.Server.2008编程入门经典(第3版).part2.rar

    11.5 控制流语句 11.5.1 IFELSE语句 11.5.2 CASE语句 11.5.3 用WHILE语句进行循环 11.5.4 WAITOR语句 11.5.5 TRY/CATCH块 11.6 本章小结 11.7 练习 第12章 存储过程 12.1 创建存储过程:基本语法 12.2 使用ALTER...

    软件工程考卷样题及答案

    2004——2005学年第一学期期终试题 一、 选择题(10%) 1. 软件需求分析阶段的工作,可以分为以下4个方面:对问题的识别、分析与综合、编写需求分析文档以及( )。 A. 总结 B. 阶段性报告 C. 需求分析评审 D. ...

    《你必须知道的495个C语言问题》

    能否关掉填充,或者控制结构域的对齐方式? 27  2.14 为什么sizeof返回的值大于结构大小的期望值,是不是尾部有填充? 28 2.15 如何确定域在结构中的字节偏移量? 28 2.16 怎样在运行时用名字访问结构中的域...

    Visual.Basic.2010.&.NET4.高级编程(第6版)-文字版.pdf

    14.2.6 始终置顶——topmost属性 546 14.2.7 附属窗体 546 14.2.8 改变窗体的透明度 547 14.2.9 可视化继承 549 14.2.10 滚动窗体 549 14.2.11 mdi窗体 549 14.2.12 vb 2010中的mdi样例 550 14.2.13 ...

    代码之美(中文完整版).pdf

    2.1 版本控制与目录树的转换 2.2 表达目录树的差异 2.3 增量编辑器接口 2.4 但这是不是艺术? 2.5 像体育比赛一样的抽象 2.6 结论 第3章 我编写过的最漂亮代码 3.1 我编写过的最漂亮代码 3.2事倍功半 3.3 观点 3.4 ...

Global site tag (gtag.js) - Google Analytics