我看到下面的循环与 的循环具有相同的行为while [ 1 ]
。为什么会这样?
while [ 0 ]; do
echo "hello"
done
答案1
shell 中的单方括号是test
(单独命令或 shell 内置命令)的同义词,因此[ 0 ]
与 含义相同test 0
。test
用于进行比较和测试文件的属性,正如您可以在其联机帮助页中阅读的那样。当它没有给出看起来像比较、文件测试或它可以执行的其他操作之一的表达式时,它将测试参数是否存在并且是非空字符串。0
或都不1
是真正适合测试的输入,并且作为非空字符串测试会成功,并且 while 循环将永远循环。
你可能想尝试一下
while false; do
echo "hello"
done
可能替换false
为true
.或者也许你想要的是使用(( ))
:
while (( 0 )); do
echo "hello"
done
其行为与大多数语言类似,其中 0 表示失败/错误,1 表示成功/正确。
答案2
这里的值0并不是作为一个数字常量,而是作为一个字符串。这些测试在产生成功终止状态方面的效果都是相同的:
[ A ]
[ "XYZ" ]
[ 0 ]
这些会产生失败的终止状态:
[ ]
[ "" ]
有一个非空参数,其计算结果为逻辑 true。这允许您执行以下操作:
if [ $UNDER_NUCLEAR_ATTACK ] ; then
launch-missiles -a $DRY_RUN # $DRY_RUN set to "-n" during testing
fi
该变量UNDER_NUCLEAR_ATTACK
设置为任何非空值以指示 true,或者未设置或为空以指示 false。
我们可以应用!
运算符来反转逻辑:
[ ! a ] # fails: a is nonblank so true; and not true is false.
[ ! ] # succeeds: blank is false, not blank is true.
要评估数字条件,您必须使用数字测试运算符:
while [ $A -gt $B ] ; do ...
如果A
和B
包含看起来像十进制整数的字符串,则将它们像数字一样进行比较,并且如果A
大于B
,则执行循环。因此,假设这UNDER_NUCLEAR_ATTACK
不是一个空白或非空白的字符串类型布尔值,而实际上是一个数字布尔值,它要么是0
(假),要么是其他值(真)。在这种情况下,我们将这样编写测试:
if [ $UNDER_NUCLEAR_ATTACK -ne 0 ] ; then ...
答案3
if/then 结构测试一系列命令的退出状态是否为 0(因为 UNIX 约定中 0 表示“成功”),如果是,则执行一个或多个命令。
简而言之,您返回的测试结果为零。
答案4
0 值被视为 while 循环的 true,因此 while 循环的条件为 true,因此它连续显示无限循环。如果我们用 1 替换 0,则为 true,因为我们在条件之间写入的任何整数都会返回 true