我想知道 while 循环如何评估其循环条件。手册页中写道:
而列表-1;做列表2;完毕
只要列表 list-1 中的最后一个命令返回退出状态为零,while 命令就会连续执行列表 list-2。
和
列表
列表是由运算符 ;、&、&& 或 || 之一分隔的一个或多个管道的序列,并且可以选择以 ;、& 或 之一终止。
和
管道
管道是由一个或多个命令组成的序列,由一个控制运算符 | | 分隔开。或|&。管道的格式为:
[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]
这意味着:
while <single-command>; do <list>; done;
是有效的语法。只要<single-command>
返回,列表就会被执行0
。如果我像这样运行 while 循环,我会得到(显然)错误:
$while aaa; do echo "foo"; done;
If 'aaa' is not a typo you can use command-not-found to lookup the package that contains it, like this:
cnf aaa
$while ; do echo "foo"; done;
Absolute path to '' is '/usr/sbin/', so running it may require superuser privileges (eg. root).
$while ""; do echo "foo"; done;
Absolute path to '' is '/usr/sbin/', so running it may require superuser privileges (eg. root).
令我惊讶的是,使用统一变量bar
as <single-command>
,我遇到了无限循环:
$while $bar; do echo "foo"; done;
foo
foo
foo
...
这意味着,bar
获取参数扩展为空字符串(?),执行(?)并始终返回 0。但为什么我的第二个不错误示例同等工作?有趣的是:
$while "$bar"; do echo "foo"; done;
Absolute path to '' is '/usr/sbin/', so running it may require superuser privileges (eg. root).
不起作用。这相当于我的第三个错误示例。 $bar 扩展为空字符串,并且保留未转义的引号。
所以我的问题是: shell(在我的例子中是 bash)如何解释
$while $bar; do echo "foo"; done;
命令会导致无限循环吗?
更新:
我发现空命令(不执行任何操作,返回 0)并不难模拟。空命令对应于:
.因此,非终止 while 循环可以等效地写为:
while :; do echo "foo"; done;
答案1
该while
指令后面是计算返回代码以确定是否应该循环的命令。如果返回值为 ,则继续执行0
。
引用未初始化的变量与将其初始化为“”相同。
由于运行空命令不会导致错误,因此它会返回相应的返回码 ( 0
):
$ foo=''
$ $foo
$ echo $?
0
这是正常行为,否则每次您按 Enter 键而不输入任何内容时,shell 都会给出错误。
请注意,这与指定 shell 识别为问题的空字符串不同:
$ ''
-bash: : command not found
$ echo $?
127