循环
在讲解了分支结构之后,我们接着说说循环结构。
我们使用分支来区分代码的走向,而循环通过对一组相同类型的变量的遍历,做一些重复的事情。比如,我要把作业本分发给班里的每一个同学。那么我就要循环遍历班里每一个同学的名字,然后将对应的作业本分发给他。
使用 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