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

Has*_*ant 46 bash

为什么bash有以下行为?

echo $((true == false))
1
Run Code Online (Sandbox Code Playgroud)

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

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

> echo $((true))
0
> echo $((false))
0
> echo $((true == true))
1
> echo $((false == false))
1
Run Code Online (Sandbox Code Playgroud)

zos*_*tay 56

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

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

$ echo $((true))
0
$ echo $((false))
0
Run Code Online (Sandbox Code Playgroud)

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

true
TRUE=$?
false
FALSE=$?
if (( $TRUE == $FALSE )); then echo TRUE; else echo FALSE; fi
Run Code Online (Sandbox Code Playgroud)

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

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

  • 对所有其他答案+1和-1...还有其他人读过这个问题吗? (2认同)

fge*_*fge 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
Run Code Online (Sandbox Code Playgroud)