我知道什么while
是循环。但是,我只看到它适用于:
while [condition]
while ![condition]
while TRUE (infinite loop)
其中后面的语句while
必须是TRUE
or FALSE
。
有一个名为 的 shell 内置命令:
。它被描述为一个不执行任何操作的虚拟命令,但我不知道这里是否相同,即使它可以是TRUE
或FALSE
。也许这是不同的东西,但是什么呢?
答案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; done
,until ! 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
,并且这些条件列表没有比任何其他命令更多地使用该命令。while
until
¹:
也更短并且接受参数(它会忽略)。如果您向其传递任何参数,则true
or的行为是未指定的。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.