Answers:
语法为:
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; 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类外壳程序中的),它不必仅在if
/ while
/ until
条件列表中使用,并且这些条件列表不需要比其他任何命令都更多地使用该命令。
¹ :
也较短,并且接受参数(它会忽略)。如果未指定true
或的行为,false
则不传递任何参数。因此,例如:
while : you wait; do
something
done
但是,以下行为:
until false is true; do
something
done
未指定(尽管可以在大多数shell / false
实现中使用)。
但是,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)所言。
:
不执行任何操作,但始终以返回代码0退出。因此,它是相同的while true
(假定您的系统具有true
可执行文件)。