bash - 奇怪的(无限)while 循环,代码在 "do"之前

标签 bash

我在中学任教。学校和我类的一个学生带来了这段代码,问我为什么循环永远不会结束。

1 counter=1  
2 while (( counter < 3 ))  
3 echo $LINENO: $counter  
4 do 
5    ((counter++))
6 done
7 echo $LINENO: The end

这导致无限循环,我真的不知道为什么:-(

通过bashdb运行这段代码可以看出第2行的测试不影响流程:第3行和第5行被执行,然后流程回到第2行再次测试,执行第4行和第5行,然后循环永远不会跳过第 6 行中的“完成”。

脚本不断打印计数器值并递增它。

如果我调换第 3 行和第 4 行,循环将照常运行并在 2 次迭代后停止。

我已经在 OSX 和 Linux 上的 Bash v.4 中测试了这段代码。

对这种循环行为有什么想法吗?谢谢大家。 :-)

最佳答案

while 循环中使用的条件是 whiledo 之间的所有内容。在这种情况下,条件包括每次都返回 0 的第 3 行(echo)。比较的结果将被忽略,并使用 echo 的退出状态,如 help while 中所述:

while: while COMMANDS; do COMMANDS; done

Execute commands as long as a test succeeds.

Expand and execute COMMANDS as long as the final command in the while COMMANDS has an exit status of zero.

关于bash - 奇怪的(无限)while 循环,代码在 "do"之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54215326/

相关文章:

linux - shell中如何获取最后一个参数

python - 将最后一个 Bash 命令从脚本记录到文件

Bash 脚本递归目录树

linux - 意外的行尾 - dos2unix 不会修复它

python - 如果 Django super 用户不以非交互方式存在,如何创建它?

php - 如何从数据库中删除除大列表之外的所有文件?

java - 命令行选项适用于 Windows,但不适用于 Linux

bash - 在 bash 中显示 zenity 对话框时运行命令

linux - 如何通过 sftp 通过命令行上传文件?

bash - 使用 shell 脚本将逗号分隔值转换为值列表