Bash 为什么shell脚本中的空循环无效?
我想让我的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 另一个选择是只设置一
#!/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
分叉,具体取决于
的实现方式(内置于shell中或作为独立应用程序)true
您正在尝试实现忙循环,请勿执行此操作 忙循环将:
- 使用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