我已经写了以下最小例子来演示
以下不起作用:
#! /bin/bash
n=1 m=2
while (( n < m ))
echo "$n $m"
(( n=n+1 ))
do
continue
done
以下内容有效:
#! /bin/bash
n=1 m=2
while true
echo "$n $m"
(( n=n+1 ))
do
if (( n < m ))
then
continue
else
break
fi
done
我明白为什么第二种形式有效。我不明白为什么第一种形式不起作用。
我写这些脚本认为它们是等价的。 (产生相同的输出。)然而第一个循环无穷大!为什么会这样?
答案 0 :(得分:3)
首先,快速浏览一下文档:
$ help while
while: while COMMANDS; do COMMANDS; done
Expand and execute COMMANDS as long as the final command in the
`while' COMMANDS has an exit status of zero.
请注意while
命令中的确切文本:最终命令是退出状态计数的命令。我们稍后会回来。
在原始代码中:
while (( n < m ))
echo "$n $m"
(( n=n+1 ))
do
continue
done
...你没有检查(( n < m ))
是否属于你的状况;相反,您要检查(( n = n + 1 ))
是否为真。
这是正确的,因为 do
之前的所有内容都构成了确定是否继续运行循环的条件,以及由换行符分隔的一系列命令的退出状态;
s是该系列中最后一个命令的退出状态。 (( n = n + 1 ))
不成立的唯一情况(假设没有内容无法强制转换为整数或导致错误),如果初始值低于0,则结果为0或以下。
如果你真的希望所有这些命令都在你的条件之内,你可以写一下:
while (( n < m )) && echo "$n $m" && (( n = n + 1 )); do :; done
......当然,这种行为有些不同(如果比较失败,则不会回复)。
改为考虑:
while (( n < m )); do
echo "$n $m"
(( n++ ))
done