Bash脚本。虽然循环与整数比较永远不会退出

时间:2016-10-28 15:25:31

标签: bash

我已经写了以下最小例子来演示

以下不起作用:

#! /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

我明白为什么第二种形式有效。我不明白为什么第一种形式不起作用。

我写这些脚本认为它们是等价的。 (产生相同的输出。)然而第一个循环无穷大!为什么会这样?

1 个答案:

答案 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