while命令

while命令允许定义一个要测试 的命令,然后循环执行一组命令,只要定义的测试命令返回的是退出状态码0。它会在每次迭代的 一开始测试test命令。在test命令返回非零退出状态码时,while命令会停止执行那组命令。

while命令的格式是:

while testcommand do
other commands
done

while命令中定义的test command和if-then语句)中的格式一模一样。可以使用任何普通的bash shell命令,或者用test命令进行条件测试,比如测试变量值。

while命令允许你在while语句行定义多个测试命令。只有最后一个测试命令的退出状态码 会被用来决定什么时候结束循环。如果你不够小心,可能会导致一些有意思的结果。下面的例子将说明这一点。

1
2
3
4
5
6
while echo $var1
       [ $var1 -ge 0 ]
do
    echo "This is inside the loop"
    var1=$[ $var1 - 1 ]
done

注意,每个测试命令都出现在单独的一行上。

第一个测试简单地显示了var1变量的当前值。第二个测试用方括号来判断var1变量的值。

在循环内部,echo语句会显示一条简单的消息,说明循环被执行了。注意当你运行本例时输出 是如何结束的。注意当你运行本例时输出 是如何结束的。

This is inside the loop
-1
$

while循环会在var1变量等于0时执行echo语句,然后将var1变量的值减一。接下来再次执 行测试命令,用于下一次迭代。echo测试命令被执行并显示了var变量的值(现在小于0了)。直到shell执行test测试命令,whle循环才会停止。

这说明在含有多个命令的while语句中,在每次迭代中所有的测试命令都会被执行,包括测试命令失败的最后一次迭代。要留心这种用法。

until命令

until命令和while命令工作的方式完全相反。until命令要求你指定一个通常返回非零退 出状态码的测试命令。只有测试命令的退出状态码不为0,bash shell才会执行循环中列出的命令。 一旦测试命令返回了退出状态码0,循环就结束了。

和你想的一样,until命令的格式如下。

1
2
3
4
until test commands 
do
	other commands
done

和while命令类似,你可以在until命令语句中放入多个测试命令。只有最后一个命令的退出状态码决定了bash shell是否执行已定义的other commands。

break命令

跳出内部循环

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

1
2
3
4
5
6
7
 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

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

这种方法同样适用于while和until循环。

跳出外部循环

有时你在内部循环,但需要停止外部循环。break命令接受单个命令行参数值:

break n

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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 " done
	done
done

continue命令

continue命令可以提前中止某次循环中的命令,但并不会完全终止整个循环。可以在循环内部设置shell不执行命令的条件。

1
2
3
4
5
6
7
for (( var1 = 1; var1 < 15; var1++ ))
    do
       if [ $var1 -gt 5 ] && [ $var1 -lt 10 ]
       then
continue fi
       echo "Iteration number: $var1"
    done

当if-then语句的条件被满足时(值大于5且小于10),shell会执行continue命令,跳过此 次循环中剩余的命令,但整个循环还会继续。当if-then的条件不再被满足时,一切又回到正轨。

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

continue n

其中n定义了要继续的循环层级。