Shell 循环结构中continue和break的用法
Shell编程中常用到循环结构以完成大量重复的、有规律任务。
一般而言,脚本程序在开始执行循环体后,要等到所有循环迭代完成后,循环命令才会结束。
但我们可以使用两个特定的命令continue、break配合条件判断命令控制循环体在执行过程中停止执行。
尽管continue和break都是用在循环体中,用以停止某个层次循环的终止,但二者作用域却不同。
continue命令
continue用于停止本次循环,不再执行后续命令,直接进入下一轮循环,并非将整个循环体终止。
假设一个循环体原本需要执行10次循环,但是在执行到第5次的时候,满足某个条件,开始执行continue命令,continue命令会直接终止第5次循环,开始执行第6次循环,直到循环结束。
下面以示例代码进行解说。
[root@Centos]#cat t1.sh
#!/bin/bash
for (( i = 1; i < 11; i++ ))
do
if [ $i -eq 4 ] || [ $i -eq 7 ]
then
continue
fi
echo "Iteration number: $i"
done
脚本t1.sh实现的功能是将1-10中除了4和7,其余的数字都打印出来。
观察脚本命令,第二行定义了一个for循环for (( i = 1; i < 11; i++ ))
,其中变量i初始值为1,循环执行判断条件为i < 11
,并在每一次循环结束后自加1,并将新的变量i的值送入循环执行判断条件i < 11
,若满足则执行循环体;若不满足则for循环终止。接下来的7行都属于for循环体。
for循环中有一条if判断语句if [ $i -eq 4 ] || [ $i -eq 7 ]
,表明当变量i的值为4或者7,都将执行if条件判断语句里面的命令。
一般而言,执行完if语句后,还会继续执行for循环体剩下的命令echo "Iteration number: $i"
,但由于if语句里面的命令时continue,会直接跳出本次循环,不在执行后续的echo "Iteration number: $i"
,后或i自加1,执行for循环判断,直到i=11,i < 11
为假,循环结束。
脚本执行结果如下:
[root@Centos]#./t1.sh
Iteration number: 1
Iteration number: 2
Iteration number: 3
Iteration number: 5
Iteration number: 6
Iteration number: 8
Iteration number: 9
Iteration number: 10
break命令
break命令用于跳出当前命令所在的循环体,也即直接终止了整个循环命令。
还是假设一个循环体原本需要执行10次循环,但是在执行到第5次的时候,满足某个条件,开始执行break命令,break命令会直接终止并跳出整个循环,后续的第6、7、8、9、10次循环不在执行。
现在将前面测试continue的脚本略作修改,将continue替换成break,就可简单观察出break命令的特点。
下面以示例代码进行解说。
[root@Centos]#cat t2.sh
#!/bin/bash
for (( i = 1; i < 11; i++ ))
do
if [ $i -eq 4 ] || [ $i -eq 7 ]
then
break
fi
echo "Iteration number: $i"
done
脚本t2.sh实现的功能是按顺序打印1-10,如果遇到数字4或者7,循环结束,后续数字不在打印。
观察脚本命令,第二行定义了一个for循环for (( i = 1; i < 11; i++ ))
,其功能和前面测试continue的脚本一致,不再赘述。
而for循环里面的执if判断语句,当匹配到i=4后,开始执行break命令,直接终止并跳出本整个for循环,不在执行后续的echo "Iteration number: $i"
。
脚本执行结果如下:
[root@Centos]#./t2.sh
Iteration number: 1
Iteration number: 2
Iteration number: 3
break命令在多层嵌套循环中的使用
前面我们提到在循环体中执行break命令会终止循环体,现在我们再来看一个例子:
[root@Centos]#cat t3.sh
#!/bin/bash
for (( m=2;m < 5;m++ ))
do
for (( n=1;n < 5;n++ ))
do
if [ $[$n%3] -eq 0 ]
then
break
fi
echo "$m * $n = $[$m*$n]"
done
done
脚本在第一个for循环for (( m=2;m < 5;m++ ))
内部又定义了一个for循环for (( n=1;n < 5;n++ ))
,
在第二个循环内部定一个执行break的if条件判断语句if [ $[$n%3] -eq 0 ]
,即当n为3的整数倍时,执行break命令。
按照break跳出循环体的功能,当m=2,n=3时,执行break命令,猜测会有如下结果输出:
# 预测结果
2 * 1 = 2
2 * 2 = 4
但实际脚本的执行结果如下:
# 实际结果
2 * 1 = 2
2 * 2 = 4
3 * 1 = 3
3 * 2 = 6
4 * 1 = 4
4 * 2 = 8
所以要注意,
因为代码中的break是内循环的,所以内循环break结束后,外循环依然继续。
对于多层的循环,break的作用也是相似的,它终止的是命令所在的循环体。其上层循环体不受影响。
原文链接:https://blog.csdn.net/geoffreychan/article/details/77608693
(以上。)