while ['qwe'='rty']
do
echo yes
done
条件明显不正确,但终端打印&;yes&;;下去。为什么会这样呢?
条件明显不正确…
没有,这真的不是
<一口>(1)一口>。条件(包括 "command">(2))将[
和]
字符与条件分隔开,以便bash
将条件解释为三部分测试。
您所提供的内容(假设上面描述的丢失的命令空间是一个简单的打字错误)将被视为一个单部分测试,只要它不是空字符串就为真。
你可以看到下面的区别:
pax> [ 'abc' = 'xyz' ] && echo yes
pax> [ 'abc' = 'xyz' ] || echo no
no
pax> [ 'abc'='xyz' ] && echo yes
yes
bash
手册页的相关部分有这个(注意相等性检查中的空格,它们不仅仅用于在手册页本身中分隔令牌):
string
-n string
如果字符串长度非零,则为True。
string1 == string2
string1 = string2
当两个字符串相等时为True。为了POSIX一致性,
=
应该与test
命令一起使用。
换句话说,应该作为while
语句是:
while [ 'qwe' = 'rty' ]
(1)从技术上讲,它是不正确的,但不是你所说的(false)。相反,它是不正确的,因为它不是你认为的表达式,它是:-)
(2)如果没有这些命令空间,您将看到如下语法错误:
pax> ['abc' = 'xyz'] && echo yes
[abc: command not found
pax> ['abc'='xyz'] && echo yes
[abc=xyz]: command not found
当然,除非您实际上有一个名为[abc=xyz]
的可执行目标,在这种情况下,它将被执行,并且返回值将决定采取什么操作。这是一个不太可能的可执行目标,但它是可能的:
pax> echo true > '[abc=xyx]' ; PATH=$PATH:.
pax> ['abc'='xyx'] && echo yes
yes