(028) Linux之shell流控制——while和util循环
十年运维系列之基础篇 - Linux
作者:曾林
联系:1494445739@qq.com
版权:文章未经同意请勿转载
一、引言
日常生活中充满了循环。每天上班、遛狗和切胡萝卜等都需要重复一系列的步骤。就比如用伪代码来描述切胡萝卜的过程,可能会是这样的。
- 取案板
- 取刀
- 把胡萝卜放在案板上
- 拿起刀
- 前移胡萝卜
- 切胡萝卜
- 若整根胡萝卜都切好了,就退出程序,否则继续从第4步开始操作。
第4步到第7步构成了一个循环。循环中的动作会一直重复,直到条件“整根胡萝卜都切好了”为真。
二、while语句
首先先展示一个支持while语句的shell脚本,取名为while-foo.sh。代码如下:
#!/bin/bash # script to support while statement. count=1 while (($count <= 5)); do echo $count ((count++)) done echo "finish"
while命令的语法结构如下:
while commands; do commands; done
就如同if命令一样,while会判断一系列指令的退出状态。只要退出状态为0,它就执行循环内的命令。上述脚本中,我们创建了count变量并赋予count初始值1。while命令会判断test命令的退出状态。只要test命令返回的退出状态为0,那么循环内的指令将继续执行。
三、跳出循环
bash提供了两种可用于控制循环内部程序流的内建命令。其中break命令立即终止循环,程序从循环后的语句恢复执行。continue命令则会导致程序跳过循环剩余的部分,直接开始下一次循环迭代。
break 和 continue
四、until
while命令是当command为真的时候执行,而until命令则正好相反,until是当命令失败的时候会一直运行,直到命令为真才终止循环。until语句的格式如下:
until commands; do
commands;
done
下面展示了一个until命令来执行循环的例子:
#!/bin/bash # Script to test 'until' statement count=1 until (( $count > 5 )); do echo $count count=$((count+1)) done echo "Finish."
五、使用循环读取文件
while和until语句都可以用来处理标准输入,这让使用while和until循环处理文件成为可能。使用样例如下:
#!/bin/bash # Script to test while statement to read file stream while read var1 var2 var3; do printf "var1: %s\t var2: %s\t var3: %s\t" $var1 $var2 $var3 echo "" done < distros.txt exit
为将一份文件重定向到循环中,我们可在done语句之后添加重定向操作符。循环使用read命令读取重定向文件中的字段。在到达文件末端之前,退出状态为0。在读取过文件中的每一行之后,read命令退出,此时退出状态变为非0,循环终止。
此外,还可以通过sort命令的输出并显示文本流。具体如下图:
此脚本获取sort命令的输出并显示文本流。但是需要注意的是,因为管道是在子shell中进行循环操作。当循环终止时,循环内部新建的变量或者是对变量的赋值效果都会丢失。