为什么$((true == false))在bash中评估为1?

时间:2011-12-20 17:24:21

标签: bash

为什么bash有以下行为?

echo $((true == false))
1

我原本以为这会打印0,但会打印1

以下事实使这进一步复杂化:

> echo $((true))
0
> echo $((false))
0
> echo $((true == true))
1
> echo $((false == false))
1

3 个答案:

答案 0 :(得分:56)

所有关于0为真,1为假的海报都错过了这一点。在这种情况下,由于$(())引起的算术评估上下文,1在通常的布尔意义上为0且为0。

==内的$(())操作不是Bash中返回状态的相等,它使用给定的文字执行数字相等,其中“false”和“true”被视为变量,但没有但是它们被绑定了,它们都被解释为0,因为它们还没有赋值:

$ echo $((true))
0
$ echo $((false))
0

如果您想比较true和false的返回状态,您需要以下内容:

true
TRUE=$?
false
FALSE=$?
if (( $TRUE == $FALSE )); then echo TRUE; else echo FALSE; fi

但是,我不确定你为什么要这样做。

编辑:更正了原始答案中关于“true”和“false”被解释为字符串的部分。他们不是。它们被视为变量,但尚未绑定它们。

答案 1 :(得分:22)

好的,似乎对$((...))真正做的事情存在很多困惑。

对其操作数进行算术评估,裸字是变量,而不是命令或字符串文字(即true确实是$true ),任何不是数字的东西都是0 ==运算符比较两个数字,如果它们相等则返回1.

这就是$((true == false))为1的原因:环境中没有truefalse个环境变量,这意味着$true$false评估为空字符串,因此在算术上下文中为0!

要完成,您还可以在算术上下文中使用命令替换...例如:

$ echo $((`echo 2`))
2
$ echo $((3 + $(echo 4)))
7
$ a=3
$ echo $((a + $(echo 4)))
7
# undefine a
$ a=
$ echo $((a + $(echo 4)))
4
$ a="Hello world"
$ echo $((a + 1))
1
# undefine a again
$ a=
$ echo $(($(echo $a)))
0

答案 2 :(得分:-2)

因为在bash中,0为真,0以外的所有内容都为假。