为什么在bash中$((true==false))的值为1?
为什么bash会有以下行为为什么在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
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
计算为空字符串,而不是文本.tryecho$($(echo$a))
其中未定义a
:它不会产生语法错误,但返回0。尽管如此,他正确地说字符串的值为0。但实际上,在此上下文中,任何非数字的值都为0。