如何理解破折号"while sleep 1000; do :; done"中使用的语法?



我在VS Code文档中看到了这行脚本。

while sleep 1000; do :; done

我知道这一行的功能是防止进程退出。但是我不懂语法。你能帮我解释一下剧本吗?你对学习破折号语法有什么建议吗?

:是一个shell内置,代表truetrue命令不执行任何操作,执行成功(返回0)。

while命令的语法如下:

while command1 ; do command2 ; done

执行command1,完成后,shell检查命令是否成功或失败。在第一种情况下,执行command2,然后再次触发command1,否则循环停止。

在你的例子中,sleep 1000等待1000秒,成功,然后true被调用,然后循环被一次又一次地调用(sleep永远不会失败,这是一个无限循环)。

这种单行代码实际上可能对保持脚本存活有好处,同时运行其他东西,如协例程或信号陷阱;这是非常经济的,因为在sleep期间,进程被停止:这里每1000秒,进程被恢复并再次停止。

:是shell的null命令。它除了评估它的参数和重定向之外什么都不做。然后返回true。这有三个用途:

  1. 当您出于语法原因需要一个命令,但不想执行任何命令时。
  2. 当您想要执行某些参数展开时。
  3. 当你想截断一个文件时。

1的用例。

while :; do
someCommand
done

重复运行某个命令,直到时间结束。

另一个原因是

while someCommand; do
:
done

运行一些命令,直到它失败

2的用例。正在为变量设置默认值,如

所示
: ${EDITOR:=vi}

指定EDITOR=vi,除非它已设置或为空。

3的用例。

: >file

截断文件。许多shell允许非posix变体>file,但可移植脚本不应该依赖于它。

下面是一些来自https://www.gnu.org/software/bash/manual/bash.html#Shell-Syntax:的引语来解释你的问题

while命令的语法为:

while test-commands; do consequent-commands; done

执行后果命令只要test-commands退出状态为零。返回状态为result -commands中最后执行的命令的退出状态,或


,—语句之间可以用分号分隔。以分号分隔的命令依次执行;壳在等待对于每个命令依次终止。返回状态为退出最后一次执行命令的状态。

:-如果语句中包含冒号,操作符将测试两个参数是否存在,且其值是否为空;如果省略冒号,操作符只测试是否存在。

相关内容

  • 没有找到相关文章

最新更新