shell结构化命令——循环控制

你可能认为循环一旦启动,在结束之前就哪都去不了了。事实并非如此。有两个命令可以控制循环的结束时机。

  • break命令
  • continue命令

这两个命令的用法各不相同。下面将介绍如何使用两者控制循环操作。

break命令

break命令是退出循环的一种简单方法。你可以用break命令退出任意类型的循环,包括while循环和until循环。

break命令适用于多种情况。接下来将逐一介绍。

1.跳出单个循环

shell在执行break命令时会尝试跳出当前正在执行的循环:

$ cat test1
#!/bin/bash
# breaking out of a for loop

for var1 in 1 2 3 4 5 6 7 8 9 10
do
    if [ $var1 -eq 5 ]
    then
        break
    fi
    echo "Iteration number: $var1"
done
echo "The for loop is completed"
$ ./test1
Iteration number: 1
Iteration number: 2
Iteration number: 3
Iteration number: 4
The for loop is completed

for循环通常会遍历列表中的所有值。但当满足if-then的条件时,shell会执行break命令,结束for循环。

该方法同样适用于while循环和until循环:

$ cat test2
#!/bin/bash
# breaking out of a while loop

var1=1

while [ $var1 -lt 10 ]
do
    if [ $var1 -eq 5 ]
    then
        break
    fi
    echo "Iteration: $var1"
    var1=$[ $var1 + 1 ]
done
echo "The while loop is completed"
$ ./test2
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4
The while loop is completed

如果if-then的条件成立,就执行break命令,结束while循环。

2.跳出内层循环

在处理多个循环时,break命令会自动结束你所在的最内层循环:

$ cat test3
#!/bin/base
# breaking out of an inner loop
for ((a = 1; a < 4; a++ ))
do
    echo "Outer loop: $a"
    for (( b = 1; b < 100; b++ ))
    do
        if [ $b -eq 5 ]
        then
            break
        fi
        echo "    Inner loop: $b"
    done
done
$ ./test3
Outer loop: 1
    Inner loop: 1
    Inner loop: 2
    Inner loop: 3
    Inner loop: 4
Outer loop: 2
    Inner loop: 1
    Inner loop: 2
    Inner loop: 3
    Inner loop: 4
Outer loop: 3
    Inner loop: 1
    Inner loop: 2
    Inner loop: 3
    Inner loop: 4

内层循环里的for语句指明当变量b的值等于100时停止迭代。但其中的if-then语句指明当变量b的值等于5时执行break命令。注意,即使break命令结束了内层循环,外层循环依然会继续执行。

3.跳出外层循环

有时你位于内层循环,但需要结束外层循环。break命令接受单个命令行参数:

break n

其中n指定了要跳出的循环层级。在默认情况下,n为1,表明跳出的是当前循环。如果将n设为2,那么break命令就会停止下一级的外层循环:

$ cat test4
#!/bin/bash
# breaking out of an outer loop
for (( a = 1; a < 4; a++ ))
do
    echo "Outer loop: $a"
    for (( b = 1; b < 100; b++ ))
    do
        if [ $b -gt 4 ]
        then
            break 2
        fi
        echo "    Inner loop: $b"
    done
done
$ ./test4
Outer loop: 1
    Inner loop: 1
    Inner loop: 2
    Inner loop: 3
    Inner loop: 4

注意,当shell执行了break命令后,外部循环就结束了。

continue命令

continue命令可以提前中止某次循环,但不会结束整个循环。你可以在循环内部设置shell不执行命令的条件。来看一个在for循环中使用continue命令的简单例子:

$ cat test5
#!/bin/bash
# using the continue command

for (( var1 = 1; var1 < 15; var1++ ))
do
    if [ $var1 -gt 5 ] && [ $var1 -lt 10 ]
    then
        continue
    fi
    echo "Iteration number: $var1"
done
$ ./test5
Iteration number: 1
Iteration number: 2
Iteration number: 3
Iteration number: 4
Iteration number: 5
Iteration number: 10
Iteration number: 11
Iteration number: 12
Iteration number: 13
Iteration number: 14

当if-then语句的条件成立时(值大于5且小于10),shell会执行continue命令,跳过此次循环中剩余的命令,但整个循环还会继续。当if-then的条件不成立时,一切会恢复如常。

也可以在while循环和until循环中使用continue命令,但要特别小心。记住,当shell执行continue命令时,它会跳过剩余的命令。如果将测试变量的增值操作放在了其中某个条件里,那么问题就出现了:

$ cat badtest1
#!/bin/bash
# improperty using the continue command in a while loop

var1=0

while echo "while iteration: $var1"
    [ $var1 -lt 15 ]
do
    if [ $var1 -gt 5 ] && [ $var1 -lt 10 ]
    then
        continue
    fi
    echo "    Inside iteration number: $var1"
    var1=$[ $var1 + 1 ]
done
$ ./badtest1 | more
while iteration: 0
    Inside iteration number: 0
while iteration: 1
    Inside iteration number: 1
while iteration: 2
    Inside iteration number: 2
while iteration: 3
    Inside iteration number: 3
while iteration: 4
    Inside iteration number: 4
while iteration: 5
    Inside iteration number: 5
while iteration: 6
while iteration: 6
while iteration: 6
...

你得确保将脚本的输出重定向至more命令,这样才能停止输出。在if-then的条件成立之前,一切看起来都很正常,然后shell会执行continue命令,跳过while循环中余下的命令。不幸的是,被跳过的正是对$var1计数变量增值的部分,而该变量又被用于while测试命令中。这意味着这个变量的值不会再变化了,从前面连续的输出中也可以看到。

和break命令一样,continue命令也允许通过命令行参数指定要继续执行哪一级循环:

continue n

其中n定义了要继续的循环层级。下面是一个继续执行外层for循环的例子:

$ test6
#!/bin/bash
$ continuing an outer loop

for (( a = 1; a <= 5; a++ ))
do
    echo "Iteration $a:"
    for (( b = 1; b < 3; b++ ))
    do
        if [ $a -gt 2 ] && [ $a -lt 4 ]
        then
            continue 2
        fi
        var3=$[ $a * $b ]
        echo "    The result of $a * $b is $var3"
    done
done
$ ./test6
Iteration 1:
    The result of 1 * 1 is 1
    The result of 1 * 2 is 2
Iteration 2:
    The result of 2 * 1 is 2
    The result of 2 * 2 is 4
Iteration 3:
Iteration 4:
    The result of 4 * 1 is 4
    The result of 4 * 2 is 8
Iteration 5:
    The result of 5 * 1 is 5
    The result of 5 * 2 is 10

其中的if-then语句

if [ $a -gt 2 ] && [ $a -lt 4 ]
then
    continue 2
fi

会使用continue命令停止处理循环内的命令,但会继续处理外层循环。注意值为3那次迭代并没有处理任何内部循环语句,因为尽管continue命令停止了处理,但外层循环依然会继续。

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值