“ while:;”是什么意思?


27

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

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

之后的陈述while必须为TRUEFALSE

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


4
该命令:不执行任何操作,但始终以返回代码0退出。因此,它是相同的while true(假定您的系统具有true可执行文件)。
John1024 '17

@ John1024它返回零,除非对其参数求值会导致错误,例如,通过将值分配给只读变量。
库萨兰达

3
@Kusalananda是的,如果:命令从不执行,则不会返回0。但是在我看来,这太过分了。
高清

Answers:


50

语法为:

while
  first list of commands
do
  second list of commands
done

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

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

while :; do cmd; done

一劳永逸cmd:一如既往地返回成功。那是永远的循环。您可以改用以下true命令使其更清晰:

while true; do cmd; done

用喜欢的人::总是内置,而true不是(很久以前,大部分炮弹都true时下内置)¹。

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

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类外壳程序中的),它不必仅在if/ while/ until条件列表中使用,并且这些条件列表不需要比其他任何命令都更多地使用该命令。


¹ :也较短,并且接受参数(它会忽略)。如果未指定true或的行为,false则不传递任何参数。因此,例如:

while : you wait; do
  something
done

但是,以下行为:

until false is true; do
  something
done

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


12

while :是一个无限循环。:什么都不做(成功)。

因此,如果您希望外壳永久挂起而无所事事,则可以将其写为

while :
do
    :
done

或使用单行;代替换行:while :; do :; done

while :通常用于需要重复执行某项操作而没有附加特殊条件的情况。您可以使用continuebreak语句内循环来控制它或将条件转移到像一个循环的结束do ... while构造。


12

但是,while之后的语句必须为TRUE或FALSE。

不,条件部分中的命令可以是任何命令(*)所有的 shell命令都有一些返回值,并且while循环(以及if条件循环)将返回值为零的值称为“ true”,将所有其他返回值的值为“ false”。(*或几个命令的列表,最后一个很重要)

至于:Bash的手册清楚地告诉了它的返回状态是:

: [arguments]
除了扩展参数和执行重定向之外,什么也不要做。返回状态为零。

help内置更是明确:

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

s/any command/any sequence of commands/,如史黛芬(Stéphane)所言。
Toby Speight
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.