shell 编程教程(8)控制循环的语句 break continue

不是所有的循环体都只能等待所有循环结束后才能退出,使用 break 或 continue 可以控制循环的流程。

1. break

跳出当前循环体,如果有多层循环,只跳出当前层。

例如:

#!/bin/bash
echo for的输出:
for num in {0..9}
do
	echo $num
	if [[ $num -eq 4 ]]
	then
		break
	fi
done

echo while的输出:
num=0
while [[ $num -lt 10 ]]
do
	echo $num
	if [[ $num -eq 4 ]]
	then
		break
	fi
	((num++))
done

echo until的输出:
num=0
until [[ $num -ge 10 ]]
do
	echo $num
	if [[ $num -eq 4 ]]
	then
		break
	fi
	((num++))
done

以上代码无论是 for、while 还是 until,都添加了在 num 等于4时跳出循环的设置,来看看输出:

for的输出:
0
1
2
3
4
while的输出:
0
1
2
3
4
until的输出:
0
1
2
3
4

可以看到,循环到4的时候就停止了。

下边看看嵌套循环的例子:

[root@server ~]# cat break2.sh
#!/bin/bash
for i in {1..5}
do
	for j in {1..5}
	do
		echo "($i,$j)"
		if [[ $i -eq $j ]]
		then
			break
		fi
	done
done

[root@server ~]# sh break2.sh
(1,1)
(2,1)
(2,2)
(3,1)
(3,2)
(3,3)
(4,1)
(4,2)
(4,3)
(4,4)
(5,1)
(5,2)
(5,3)
(5,4)
(5,5)

可以看到,break 只是跳出了内层循环,外层循环不受影响,因为 break 之后 i 的值还在递增。如果 break 是跳出所有循环,那么只会输出 (1,1)。

break 可以跟上一个正整数,代表跳出几层循环:

[root@server ~]# cat break3.sh
#!/bin/bash
for i in {1..3}
do
	for j in {1..3}
	do
		for k in {1..3}
		do
			echo "($i,$j,$k)"
			if [[ $i -eq $j && $j -eq $k ]]
			then
				break 2
			elif [[ $i -eq $k ]]
			then
				break
			fi
		done
	done
done

[root@server ~]# sh break3.sh
(1,1,1)
(2,1,1)
(2,1,2)
(2,2,1)
(2,2,2)
(3,1,1)
(3,1,2)
(3,1,3)
(3,2,1)
(3,2,2)
(3,2,3)
(3,3,1)
(3,3,2)
(3,3,3)

2. continue

跳出当次循环。

例如:

[root@server ~]# cat continue.sh
#!/bin/bash
echo for的输出:
for num in {1..5}
do
	if (($num==3))
	then
		continue
	fi
	echo $num
done

echo while的输出:
num=0
while [[ num -lt 5 ]]
do
	((num++))
	if [[ $num -eq 3 ]]
	then
		continue
	fi
	echo $num
done

echo until的输出:
num=0
until [[ num -ge 5 ]]
do
    ((num++))
	if [[ $num -eq 3 ]]
	then
		continue
	fi
	echo $num
done

当 num 等于 3 时,跳到下一次循环,即当次循环的打印操作不执行,所以没有打印 3:

[root@server ~]# sh continue.sh
for的输出:
1
2
4
5
while的输出:
1
2
4
5
until的输出:
1
2
4
5

continue 也可以跟上一个正整数,代表跳到下几层循环:

[root@server ~]# cat continue2.sh
#!/bin/bash
for i in {1..5}
do
	for j in {1..3}
	do
		if [[ $i -eq 3 ]]
		then
			continue 2
		fi
		echo "($i,$j)"
	done
done

[root@server ~]# sh continue2.sh
(1,1)
(1,2)
(1,3)
(2,1)
(2,2)
(2,3)
(4,1)
(4,2)
(4,3)
(5,1)
(5,2)
(5,3)

 总结

break 可以跳出本层循环,break n 可以跳出 n 层循环。continue 可以跳过本层的本次循环,continue n 可以跳过 n 层的本次循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值