上一节中,我们学习了流程控制语句中的分支语句。本节,我们一起来了解一下流程控制中的最后一个部分——循环语句,学会运用三个常见的循环语句(for while until)。
循环语句简介
循环语句,是指在符合一定条件的情况下,可以重复执行一段语句。主要为了满足某些情况下执行一些重复但有一定微小差异的动作,如批量修改文件、定时执行命令、反自复制木马等。有了循环语句,计算机程序也就真正体现了其运算优势,大大提高了程序的编码效率。
for 循环
简介
for循环为定循环,for循环在为语句提供循环的同时使变量发生集合枚举和迭代。变量在一个范围或集合中每得到一个枚举或迭代的新值,就将循环体内的语句循环一次
语法
#第一种形式:枚举
for Var in Key1 Key2 Key3...
#其中,Var为变量 Key1 Key2等为变量枚举中选中的集合值
do
<Action>
done
#第二种形式:迭代
for Var in {n1..n2[..step]}
#n1 为起始数字;n2 为结束数字; step可选,为步长,即每步增加的数字
do
<Action>
done
示例
#以下示例求1到100中所有奇数的和
sum=0
for i in {1..100..2}
do
sum=$[$sum + $i]
done
echo $sum
注意事项
- 对于迭代形式,数据起始数据不仅仅是数字,也可以是字母等,如
{a..z}
会将所有小写字母迭代一遍 - 枚举不需要括号,仅需要在每个值之间空格即可
- 在循环体中可以更改循环变量的值,但不会对循环过程产生影响。枚举与迭代相同,在进入下一个循环后,无论当前变量值如何,都会迭代进入下一个值
C语言风格的for循环
bash 的for循环还支持C语言风格,语法如下,其他用法相同。具体还请参阅C语言的for循环
for ((i=1;i<=10;i++))
do
echo $i
done
- 注意,bash中C语言风格的for循环含有两个括号
- 运行过程中可以更改循环变量的值,仅限于C语言风格循环
while 循环
简介
while循环与for循环不同,while循环是不定循环,也称为条件循环。其没有循环变量限制次数,在满足循环条件的情况下循环会一直进行,直到不满足循环条件。
语法
while [Condition]
do
<action>
done
示例
#以下示例同样求1-100中所有奇数的和
#!/bin/bash
#Author:Zheng
i=1
sum=0
while [ $i -lt 100 ]
do
sum=$[$sum + $i]
i=$[$i + 2]
done
echo $sum
注意事项
-
条件判断式注意括号内侧的空格
-
如果想要实现死循环,可以在条件表达式内加一个恒成立的变量,只需要在循环体中设定条件使循环跳出即可(具体见下)
-
循环必须设定有效的跳出条件(在循环条件或循环体中),否则可能导致资源占用、系统崩溃
以下示例使用死循环并用break语句进行跳出:
i=0
while [ 1 -eq 1 ]
do
i=$[$i + 1]
echo $i
if [ $i -ge 10 ]; then
break
fi
done
until 循环
简介
until循环与while循环都是不定循环,但其条件判断方式和while相反。顾名思义,until循环语句只要条件判断式不成立就一直循环,直到条件判断式成立就跳出循环。部分内容与while循环相同,就不再赘述
语法
Bash中的until循环语法与部分编程语言不同,until条件判断句在循环体之前,如果一开始就符合条件,直接跳过循环,而不是先执行一遍循环体后判断跳出。
until [Condition]
do
<Action>
done
示例
#本示例同样完成1-100中所有偶数的和
#!/bin/bash
#Author:Zheng
i=1
s=0
until [ $i -gt 100 ]
do
s=$[$s + $i]
i=$[$i + 2]
done
echo $s
注意事项
- 注意条件判断式中括号内侧的空格
循环的跳过和跳出
循环的跳过和跳出虽然只差一个字,但概念完全不同
语法
主要使用continue
语句和break
语句
for i in {1..100}
do
<action>
continue #仅跳过当前循环进入下一循环
continue n #n为数字,跳过n层循环
done
示例
#此示例在i为偶数时跳出,偶数循环号下不会显示"Finish"
for i in {1..20}
do
echo $i
if [ $[$i % 2] == 0 ]; then
continue
#当前仅有1层循环,continue 2 表示直接跳过当前的第二层循环,进入第二层的下一迭代
fi
echo "Finish"
done
echo "Final"
#此示例在i为10时退出,不输出Finish而直接Final
for i in {1..20}
do
echo $i
if [ $i == 10 ]; then
break
#当前仅有1层循环,break 2 表示直接跳出当前两层循环
fi
echo "Finish"
done
echo "Final"
注意事项
- 循环的跳过一般结合条件判断语句使用,增加循环的灵活性
continue
和break
命令中,后面加的数字都代表循环层数而不是循环次数,某些参考中可能有误,请注意
总结
三种循环格式可以相互通用,在不同的环境下某个循环会更适合,请大家结合实际场景自行选择需要使用的循环语句。
本节我们正式结束了Shell编程的学习,更加深入的函数等内容,由于Bash不是面向对象的编程语言,日常感觉应用不是很广,暂不涉及,有需要我会过一段时间更新。