zenith-docs 1.0.0 Help

循环

在讲解了分支结构之后,我们接着说说循环结构。

我们使用分支来区分代码的走向,而循环通过对一组相同类型的变量的遍历,做一些重复的事情。比如,我要把作业本分发给班里的每一个同学。那么我就要循环遍历班里每一个同学的名字,然后将对应的作业本分发给他。

使用 for 循环

举一个实际的例子,我需要对一个脚本的所有通过命令行输入的参数进行遍历打印。我们之前已经说过了,要获取所有的输入参数可以使用 $* ,那么变量呢?如下:

#!/bin/bash for arg in $* do echo $arg done

执行上面这个脚本: sh script.sh:

sh script.sh 1 2 3 4 5 ## 分别输出 1 到 5, 输出每个数字之后换行

除了使用内建的变量之外,还可以使用自定义的变量:

## 遍历列表 for city in HangZhou NanJing BeiJing DongJing ## 遍历数值 for number in {1..100} ## 遍历当前目录文件 for file in `ls` ## 如果遍历进程呢?一样的,将 ls 换成 ps 命令 ## 遍历文本文件 for line in `cat text.txt` ## 将逐行遍历文本内容,但是如果是行内有空格,则会分为两行,因为 IFS 变量的缘故,将 IFS=$'\n' 即可

如果需要喜欢 C  语言的风格,我们可以使用如下这样的写法:

for (( i = 0; i < 10; i++ )) do (( sum+= $i )) ## 对 $i 求和: sum 最终等于 45 done

使用 while 循环

接下来,我们使用 while 语句来改写上面 1 到 10 求和的这个例子:

#!/bin/bash i=1 ## 也可以写成 C 语言的风格: while ((i<10)) ## 也可以是多个条件 while((i>1 && i <10)) while [ $i -lt 10 ] do (( sum+=$i )) ## 求和 (( i++ )) ## 自增,避免死循环 done echo $sum ## 输出: 45

使用 until 循环

until 和 while 的区别是条件判断是相反的,while 是满足条件进入循环体,而 until 是满足条件退出循环体。

下面来玩一个猜数字的小游戏, 游戏规则很简单,直接看代码吧:

#!/bin/bash num=$1 ## 予以猜测的数值 read -p '请输入你猜测的数字:' input ## 中断程序,等待用户输入后,接受用户输入的内容,赋予 input 这个变量 until [ $input -eq $num ] ## 如果用户输入的内容等于被猜测的数值,则推出循环 do if [ $input -lt $num ];then ## 判断是否猜测的太小了 echo '你猜的太小了哦' fi if [ $input -gt $num ];then ## 判断是否猜测的太大了 echo '你猜的太大了哦' fi read -p '请再次输入你猜测的数字:' input ## 如果猜错了,则继续猜 done echo '恭喜你,猜对了

可以试着玩一下这个游戏:

sh script.sh 10 >> 1 ## 输出:你猜的太小了哦 >> 20 ## 输出:你猜的太大了哦 >> 10 ## 输出:恭喜你,猜对了

我们还可以增加这个游戏的难度,在规定的次数内猜对,超出了规定的次数则 Game Over:

## 首先,我们需要定义两个变量 max=3 ## 用以记录最大的猜测次数 count=0 ## 用以记录已经猜测的次数 ## 然后,我们需要在循环体中,对猜测次数进行判断,以确定是否结束游戏 if [ $count -eq $max ];then ## 如果已经猜测的次数等于最大猜测次数,则表明游戏结束 echo '十分抱歉,你输了这个游戏!' ## 输出游戏结束文案 break ## 退出循环 fi (( count++ )) ## 对猜测次数进行递增 read -p '请再次输入你猜测的数字:' input ## 重新输入 ## 最后,我们需要对是否游戏成功文案是否输出进行再次判断 if [ $count -lt $max ];then echo '恭喜你,猜对了' fi

除了使用 break 可以退出整个循环之外,还可以使用 continue 语句来达到退出某一次循环的目的。在这里就不予以演示了,自己动手试一试吧。

循环输出重定向

游戏也写好了,也玩够了,但我还希望对我游戏的结果进行保存,该怎么做呢?可以对循环的输出进行重定向,如下:

until [ $input -eq $num ] do ## ...省略中间代码 done > result.txt ## 输出重定向

除了使用 > 之外,我们还可以使用 >> 或者 | 之类的重定向符号。

总结

这一篇文档,我们详细介绍了如何在 Shell 编程中使用循环结构来做某些重复的事情。最后,我们通过编写一个猜数字的游戏,来串联、巩固了有关于循环的内容。

Last modified: 04 August 2024