"while :;" 是什么意思?意思是?

"while :;" 是什么意思?意思是?

我知道什么while是循环。但是,我只看到它适用于:

while [condition]
while ![condition]
while TRUE (infinite loop)

其中后面的语句while必须是TRUEor FALSE

有一个名为 的 shell 内置命令:。它被描述为一个不执行任何操作的虚拟命令,但我不知道这里是否相同,即使它可以是TRUEFALSE。也许这是不同的东西,但是什么呢?

答案1

语法是:

while
  first list of commands
do
  second list of commands
done

只要第一个命令列表(即该列表中的最后一次运行)成功,它就会循环运行第二个命令列表。

在那里面第一个命令列表,您可以使用该[命令进行各种测试,也可以使用:不执行任何操作并返回成功的 null 命令,或任何其他命令。

while :; do cmd; done

cmd永远一遍又一遍地运行,:一如既往地回报成功。这就是永远环形。您可以使用该true命令来使其更清晰:

while true; do cmd; done

人们过去更喜欢:as:总是内置的,而true不是(很久以前;true现在大多数 shell 都有内置的)。

您可能会看到的其他变体:

while [ 1 ];  do cmd; done

上面,我们调用[命令来测试“1”字符串是否非空(因此也始终为 true)

while ((1)); do cmd; done

使用 Korn/bash/zsh((...))语法来模仿while(1) { ...; }C 的语法。

或者更复杂的,比如until false; do cmd; doneuntil ! true...

这些有时会被别名为:

alias forever='while :; do'

所以你可以这样做:

forever cmd; done

很少有人意识到这种情况是列表命令。例如,你看到人们写:

while :; do
  cmd1
  cmd2 || break
  cmd3
done

当他们可以写:

while
  cmd1
  cmd2
do
  cmd3
done

它确实是有意义的列表因为您经常想做类似while cmd1 && cmd2; do...; done命令列表之类的事情。

无论如何,请注意,这是一个与其他命令一样的[命令(尽管它内置在现代的类似 Bourne 的 shell 中),它不必单独在 // 条件列表中使用if,并且这些条件列表没有比任何其他命令更多地使用该命令。whileuntil


¹:也更短并且接受参数(它会忽略)。如果您向其传递任何参数,则trueor的行为是未指定的。false例如,人们可以这样做:

while : you wait; do
  something
done

但是,以下行为:

until false is true; do
  something
done

未指定(尽管它可以在大多数 shell/false实现中工作)。

答案2

while :是一个无限循环。:只是什么也没做(成功)。

因此,如果您希望 shell 永远挂起而不执行任何操作,您可以将其写为

while :
do
    :
done

或者在单行中使用;而不是换行符:while :; do :; done

while :如果您想在没有附加特殊条件的情况下重复执行某件事,通常使用。您可以在循环中使用continue,break语句来控制它或像构造一样将条件移动到循环末尾do ... while

答案3

然而,while 之后的语句必须为 TRUE 或 FALSE。

不可以,条件部分的命令可以是任意命令(*)全部shell 命令有一些返回值,while循环(以及if条件)将返回值零视为“真”,将所有其他值视为“假”。(* 或多个命令的列表,最后一个有效)

至于:Bash 的手册清楚地说明了返回状态是什么:

: [arguments]
除了扩展参数和执行重定向之外,不执行任何操作。返回状态为零。

内置help的更加清晰:

 $ help :
 [...]
 No effect; the command does nothing
 Exit Status:
 Always succeeds.

相关内容