和其他高级程序设计语言一样,Shell提供了用来控制程序执行流程的命令,包括条件分支和循环结构,用户可以用这些命令创建非常复杂的程序。
9.2.1 复合结构
bash中可以使用一对花括号“{}”或圆括号“()”将多条命令复合在一起,使他们在逻辑上成为一条命令。
1.使用“{}”
使用“{}”括起来的多条命令在逻辑上成为一条命令,一般出现在管道符“|”的左边。bash将从左到右依次执行各条命令,并将各自的输出结果汇集在一起,形成输出流,作为“|”后面的输入。
 注意:
,{”之后要有一个空格,“}”之前要有一个分号。
2.使用“()”
bash执行“()”中的命令时,会再创建一个新的子进程,然后由这个子进程去执行“()”中的命令。如果不想让命令运行时,对状态集合(如环境变量,位置参数等)的改变影响到下面语句的执行,就应该把这些命令放在“()”中。
 注意:
,(”之后的空格可有可无,“)”之前的分号可有可无。
实例9-6 使用复合结构
9.2.2 条件判断
1.if条件语句
 
图9-20 if-then语句 图9-21 if-then-else语句
2.if嵌套及elif-then结构
  
图9-22 if嵌套 图9-23 else-if结构 图9-24 case语句
3.case条件选择
实例9-7 使用if条件语句编写一个Shell程序
实例9-8 使用case语句编写一个Shell程序
Shell程序如图9-26所示,其功能为:首先进入/root/txtfile目录,然后在屏幕上显示一个选择菜单,等待用户输入数字[1-2],若输入正确,则显示相应文件的内容。保存文件,文件名为case.sh。case.sh的执行结果如图9-28所示。
9.2.3 循环控制
1.for循环
for循环对一个变量的可能值,都执行一个命令序列。赋给变量的几个数值既可以在程序内以数值列表的形式提供,也可以在程序以外以位置参数的形式提供。for循环的一般格式如图9-29所示。

图9-29 for语句
实例9-9 使用for语句编写一 个Shell程序
2.while和until循环
 
图9-32 while语句 图9-33 until语句
实例9-10 使用while语句编写一个Shell程序
实例9-11 使用until语句编写一 个Shell程序
 
图9-38 true无限循环 图9-39 false无限循环
实例9-12 使用shift命令编写一个Shell程序
Shell程序如图9-40所示,其功能为:若位置参数的个数为0,则退出,否则,求出各位置参数之和。保存文件,文件名为shift_add.sh。shift_add.sh的执行如图9-41所示。
bash定义了9个位置变量,$1~$9,但是这并不意味着在命令行只能使用9个参数,借助shift命令可以访问多于9个的参数。
shift命令一次移动参数的个数由其所带的参数指定。如:shift 3,一次移动3个参数;另外,如果当shell程序处理完前9个命令行参数后,可以使用shift 9命令把$10移到$1。
9.2.4 无条件控制在Shell编程中有时要用到无限循环的技巧,也就是说,这种循环一直执行碰到break或continue命令。这种无限循环通常是使用true或false命令开始的。
从循环中退出:break命令和continue命令。
break:立即退出循环。
continue:忽略本循环中的其他命令,继续下一次循环。
 注意:
Linux系统中的true总是零值,而false则是非零值。
使用break和continue语句只有放在do和done之间才有效。
实例9-13 使用break语句编写一个Shell程序
实例9-14 使用continue语句编写一个Shell 程序