为什么空循环在 shell 脚本中无效?



我想让我的 shell 脚本无限等待,并认为下面的代码可以做到这一点。

#!/bin/bash
while true
do
done

但是,上述脚本报告语法错误。

./Infinite_Loop.sh:第 4 行:意外标记"完成"附近的语法错误

./Infinite_Loop.sh:第 4 行:"完成">

与编程语言不同,为什么 shell 脚本在循环中至少需要一个语句?

另一种选择是设置一个NOP(no op(,基本上什么都不做。

在 bash 中,NOP 的等效值是:

while true; do
:
done
我想

让我的 shell 脚本无限等待

如果您的系统支持,请使用:

sleep infinity

如果您的系统不支持它,请使用间隔较大的sleep

while :; do sleep 86400; done

注意:

  • 使用while :代替while true可能会/将删除不必要的fork,具体取决于true的实现方式(内置于 shell 中,或作为独立的应用程序(。

您正在尝试实现繁忙循环,请勿执行此操作

繁忙循环将:

  • 将 100% CPU 用于无用目的
  • 防止其他任务获取 CPU 时间
  • 降低整个系统的感知性能
  • 使用超过必要的功率,尤其是在支持动态频率缩放的系统上

为什么空循环在 shell 脚本中无效?

因为它是...bashwhile循环的格式如下:

while list-1; do list-2; done

如果不提供list-2,则没有格式正确的while循环。

正如其他人所指出的,使用noop(:(或其他任何东西来满足list-2

:记录如下:

: [arguments]
No effect; the command does nothing beyond expanding arguments and performing any
specified redirections.  A zero exit code is returned.

它不是 Bash 语法的一部分。手册告诉我们:

while 命令的语法为:

while test-commands; do consequent-commands; done

事实上,如果你深入研究 Bash 源代码,你会发现它是如何解析while loop的:

shell_command:  ...
|   WHILE compound_list DO compound_list DONE

如果你检查compound_list的定义,你可以看到它必须至少包含一个shell指令;它不能是空的。

没有理由编写一个空(无限(循环,除非你想加热你的CPU并耗尽你的电池。这可能就是 Bash 不允许空循环的原因。

正如其他人所说,您可以使用true:(后者是前者的别名(:

while true; do true; done
while :; do :; done

再次使用 true,从它的手册页: true - 什么都不做,成功

while true; do true; done

最新更新