Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 为什么shell脚本中的空循环无效?_Bash_Shell_Loops - Fatal编程技术网

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

Bash 为什么shell脚本中的空循环无效?,bash,shell,loops,Bash,Shell,Loops,我想让我的shell脚本无限期地等待,并认为下面的代码可以做到这一点 #!/bin/bash while true do done 但是,上面的脚本报告语法错误 ./Infinite_Loop.sh:第4行:意外标记“完成”附近的语法错误 /Infinite_Loop.sh:第4行:'done' 与编程语言不同,为什么shell脚本要求循环中至少有一条语句?再次使用true,从它的手册页:true-不做任何事情,成功地 while true; do true; done 另一个选择是只设置一

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

#!/bin/bash
while true
do
done
但是,上面的脚本报告语法错误

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

/Infinite_Loop.sh:第4行:'done'


与编程语言不同,为什么shell脚本要求循环中至少有一条语句?

再次使用true,从它的手册页:true-不做任何事情,成功地

while true; do true; done

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

在bash中,NOP的等价物是

while true; do
  :
done
我想让我的shell脚本无限期地等待

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

无限睡眠
如果您的系统不支持睡眠,请以较大的间隔使用
sleep

while:;睡觉86400;完成
注:

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

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

忙循环将:

  • 使用100%的CPU没有任何用处
  • 防止其他任务占用CPU时间
  • 降低整个系统的感知性能
  • 使用超过必要的功率,尤其是在支持

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

因为它是。。。
bash
while
循环的格式如下:

whilelist-1;做清单2;完成
如果您没有提供
list-2
,那么您就没有格式正确的
while
循环

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

记录如下:

:[参数]
无效;该命令除了扩展参数和执行任何
指定的重定向。返回零退出代码。

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

while命令的语法为:

while test-commands; do consequent-commands; done
事实上,如果深入研究Bash源代码,您可以找到:

如果选中,您可以看到它必须至少包含一条shell指令;它不可能是空的

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

正如其他人所说,您可以使用
true
():


早期shell版本中注释的语法。有人可能会问“但是……为什么它不是Bash语法的一部分?”。答案是Bourne shell的原始开发人员(很可能是Stephen Bourne)认为循环的语法需要一个主体,并且没有在语法规则中包含一个变体,因为没有主体的循环可能没有多大意义,因为编写一个实际上不做任何事情的循环可能没有多大意义。因此,因为开发人员没有编写语法规则来预测没有主体的循环,所以shell不支持主体。
shell_command:  ...
    |   WHILE compound_list DO compound_list DONE
while true; do true; done
while :; do :; done