17. shell当中的循环跳出,break,continue,语法详解,示意图,用例示范


前言

while、until、for、select 循环时,要提前结束循环,可以使用 break 或者 continue 关键字。

“break”与“continue”的区别:
break:在for循环使用break,则跳出这个循环,循环命令结束
continue: 使用后,在当前循环终止命令,直接进入下个循环


break

语法

break [N]:提前结束第N层整个循环,最内层为第1层 

n 表示跳出循环的层数,如果省略 n,则表示跳出当前的整个循环。break 通常和 if 一起使用,满足条件时便跳出循环。多层跳出用的地方非常少。

格式:

while CONDITION1; do 
	CMD1 
	... 
	if CONDITION2; then 
		break
	fi 
	CMDn 
	...
done

示意图在这里插入图片描述

brek 示例

  • 汇总输入的数值:
#!/bin/bash
sum=0
while read n; do
    if((n>0)); then
        ((sum+=n))
    else
        break
    fi
done
echo "sum=$sum"
[root@zaishu sh]# ./calc.sh 
10
20
0 // 触发break
sum=30
[root@zaishu sh]# ./calc.sh 
10
20// Ctrl+D 组合键(表示输入结束)
sum=30
  • 使用 break 跳出双层循环。

如果 break 不跟数字,表示跳出当前循环。例如,输出一个 4*4 的矩阵:

[root@zaishu sh]# cat juzhen.sh 
#!/bin/bash
i=0
while ((++i)); do  #外层循环
    if((i>4)); then
        break  #跳出当前循环,也就是外层循环
    fi
    j=0;
    while ((++j)); do  #内层循环
        if((j>4)); then
            break  #跳出当前循环,里面的循环
        fi
        printf "%-4d" $((i*j))
    done
    printf "\n"
done
[root@zaishu sh]# ./juzhen.sh
1   2   3   4   
2   4   6   8   
3   6   9   12  
4   8   12  16 

break 后面跟一个数字,让它一次性地跳出两层循环:

#!/bin/bash
i=0
while ((++i)); do  #外层循环
    if((i>4)); then
        break  
    fi
    j=0;
    while ((++j)); do  #内层循环
        if((j>4)); then
            break 2  // 2层循环都跳出
        fi
        printf "%-4d" $((i*j))
    done
    printf "\n"
done
[root@zaishu sh]# ./juzhen.sh 
1   2   3   4   

continue 关键字

语法

continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层
  • n 表示循环的层数:
    省略 n,表示 continue 只对当前层次的循环语句有效,遇到 continue 会跳过本次循环,忽略本次循环的剩余代码,直接进入下一次循环。
    如果带上 n,比如 n 的值为 2,那么 continue 对内层和外层循环语句都有效,不但内层会跳过本次循环,外层也会跳过本次循环,其效果相当于内层循环和外层循环同时执行了不带 n 的 continue。多次跳过用途较少。

  • continue 关键字也通常和 if 语句一起使用,即满足条件时便跳出循环。
    格式:

while CONDITION1; do 
	CMD1 
	... 
	if CONDITION2; then 
		continue 
	fi 
	CMDn 
	...
done
  • 示意图
    在这里插入图片描述

continue示例

  • 汇总用户输入的 100 以内的正数:
    #!/bin/bash
    sum=0
    while read n; do
    if((n<1 || n>100)); then
    continue
    fi
    ((sum+=n))
    done
    echo “sum=$sum”
[root@zaishu sh]# ./calc.sh 
-1   
-2
2
4
101  //Ctrl+D 结束输入,read n会判断失败,结束while
sum=6  //-1 -2 101 都会跳过,只计算2和4
  • 跳出多层循环:
[root@zaishu sh]# cat con2.sh 
#!/bin/bash
for((i=0;i<3;i++)); do
	for((n= 0;n<10;n++)); do
       		if((n == 2)); then
            		continue 2 #当前for循环执行完后,后面的代码不会再执行,直接跳到最外层循环接着向下执行
        	fi	
        	echo $n
	done
	print "\n"
done
[root@zaishu sh]# ./con2.sh 
0
1
0
1
0
1

continue 2时,不但跳过了内层 for 循环,也跳过了外层 for 循环。


总结

while、until、for、select 循环时,要提前结束循环,可以使用 break 或者 continue 关键字。
“break”与“continue”的区别:
break:在for循环使用break,则跳出这个循环,循环命令结束
continue: 使用后,在当前循环终止命令,直接进入下个循环


版权声明:本文为wangzhicheng987原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。