null string as while循环:empty / null-command

Modified on: Sat, 30 Jun 2018 08:43:30 +0800

我想知道while循环如何评估其循环条件。在手册页中写道:

  列表-1

;做list-2;完成

  
  

只要list list-1中的最后一个命令返回零退出状态,while命令就会连续执行list list-2。

  

解释强>

  
  

列表是由一个运算符分隔的一个或多个管道的序列;&,&&或||,并且可选地以;,&,或。

之一终止。

  

管道强>

  
  

管道是由一个控制运算符|分隔的一个或多个命令的序列或|&amp ;.管道的格式是:

         [time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]

这意味着:

while <single-command>; do <list>; done;

是有效的语法。只要&lt;single-command&gt;返回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作为&lt;single-command&gt;,我遇到了一个无限循环:

$while $bar; do echo "foo"; done;
foo
foo
foo
...

这意味着,bar将参数扩展为空字符串(?),执行(?)并始终返回0.但为什么不是我的第二个错误示例< / em>等效地工作?有趣的是:

$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;

命令导致无限循环?

更新强>:

我发现null-command(什么都不做,返回0)并不难以模拟。 null命令对应于:。因此,非终止while循环可以等效地编写为:

while :; do echo "foo"; done;
作者:,FloHe

最佳答案

while指令之后是用于评估返回代码的命令,以确定它是否应该循环。如果返回值为0,则继续。

引用未初始化的变量与将其初始化为''。

相同

由于运行空命令不会导致错误,因此返回相应的返回码(0):

$ foo=''
$ $foo
$ echo $?
0

这是正常的行为,因为每次按Enter键而不键入任何内容时shell都会出错。

请注意,这与指定shell标识为问题的空字符串不同:

$ ''
-bash: : command not found
$ echo $?
127

相关问答

添加新评论