为什么bash有以下行为?
echo $((true == false))
1
我原本以为这会打印0
,但会打印1
。
以下事实使这进一步复杂化:
> echo $((true))
0
> echo $((false))
0
> echo $((true == true))
1
> echo $((false == false))
1
答案 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的原因:环境中没有true
或false
个环境变量,这意味着$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以外的所有内容都为假。