为什么在bash中$((true==false))的值为1?

为什么在bash中$((true==false))的值为1?,bash,Bash,为什么bash会有以下行为 echo$((true==false)) 1. 我本以为这会打印0,但它会打印1 以下事实使情况更加复杂: > echo $((true)) 0 > echo $((false)) 0 > echo $((true == true)) 1 > echo $((false == false)) 1 所有谈论0为真1为假的海报都没有抓住要点。在本例中,1为true,0为false,这是因为$(())导致的算术计算上下文 =中的$(())操作在B

为什么bash会有以下行为

echo$((true==false))
1.
我本以为这会打印
0
,但它会打印
1

以下事实使情况更加复杂:

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

所有谈论0为真1为假的海报都没有抓住要点。在本例中,1为true,0为false,这是因为
$(())
导致的算术计算上下文

=
中的
$(())
操作在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
实际上是
$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

另外,
echo$($TRUE==$FALSE))
将按照您的预期报告
0
echo$($TRUE=$TRUE))
echo$($FALSE=$FALSE))
也将报告
1
。这是正确的。bash中不存在boolean形式的“true”和“false”,因此在
$(())
+1和-1中没有特殊意义。。。还有人读过这个问题吗?对不起,这个问题不成立。例如:if
($TRUE==$FALSE));然后回音为真;否则回声是假的;fi
)上的语法错误,然后
$(…)
对其操作数执行算术求值返回0是因为名为
true
的环境中没有变量,操作数的算术计算对任何字符串都产生0。@fge,您部分正确,但并非完全正确。
$((true))
返回0是因为在本地环境中未为$true赋值(我的解释并不完全正确)并且会马上纠正。我相信@izkata已经解释了你不完全正确的部分,因为
if($TRUE=$FALSE));…
如前所述,在Mac电脑上使用全新的环境在Bash 3.2上运行良好。这很可能是旧版本Bash上的语法错误。我已经对这个答案进行了升级,因为您正确地说出了与@zostay完全相同的内容,您只是不理解他的示例。您得到了一个语法错误,因为TRUE和FALSE没有定义在shell中定义;他的完整示例确实将它们定义为true和false命令的数字返回码(请更仔细地查看另一个答案中它上面的4行;
true=$?
正在定义变量$true,等等)我的例子是正确的。但不,我不是说同样的事情:@zostay说
true
false
被视为字符串——事实并非如此!它们被视为环境变量,这是一个完全不同的野兽,
$true
$false
计算为空字符串,而不是文本.try
echo$($(echo$a))
其中未定义
a
:它不会产生语法错误,但返回0。尽管如此,他正确地说字符串的值为0。但实际上,在此上下文中,任何非数字的值都为0。