砰。为什么"while"条件不正确的语句有效?


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

最新更新