Linux Bash Shell编程(十):流程控制语句(下) 循环语句(for while until)

上一节中,我们学习了流程控制语句中的分支语句。本节,我们一起来了解一下流程控制中的最后一个部分——循环语句,学会运用三个常见的循环语句(for while until)。

Shell 10

循环语句简介

  循环语句,是指在符合一定条件的情况下,可以重复执行一段语句。主要为了满足某些情况下执行一些重复但有一定微小差异的动作,如批量修改文件、定时执行命令、反自复制木马等。有了循环语句,计算机程序也就真正体现了其运算优势,大大提高了程序的编码效率。


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"

 注意事项

  • 循环的跳过一般结合条件判断语句使用,增加循环的灵活性
  • continuebreak命令中,后面加的数字都代表循环层数而不是循环次数,某些参考中可能有误,请注意

总结

  三种循环格式可以相互通用,在不同的环境下某个循环会更适合,请大家结合实际场景自行选择需要使用的循环语句。

  本节我们正式结束了Shell编程的学习,更加深入的函数等内容,由于Bash不是面向对象的编程语言,日常感觉应用不是很广,暂不涉及,有需要我会过一段时间更新。

上一节,Linux Bash Shell编程(九):流程控制语句(上) 分支语句(if、case)

猜你喜欢

转载自blog.csdn.net/Zheng__Huang/article/details/108081390