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

为什么bash有以下行为?

echo $((true == false)) 1 

我会认为这将打印0 ,但它打印1

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

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

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

$(())==操作与Bash中的返回状态并不相同,它使用给定的文字来执行数字相等,其中“false”和“true”被视为variables,但尚未被绑定,被解释为0,因为它们没有赋值:

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

如果你想比较true和false的返回状态,你需要这样的东西:

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

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

编辑:更正原来的答案部分关于“真”和“假”被解释为string。 他们不是。 他们被视为变数,但是没有任何价值。

好的,所以,似乎对$((...))真的有什么困惑。

对它的操作数进行算术评估 ,裸词是variables,而不是命令或string文字 (即, true$true ),并且任何不是数字的是0==运算符比较两个数字,如果相等则返回1。

这就是为什么$((true == false))是1:环境中没有truefalse环境variables,这意味着$true$false都是空string,因此在算术语境中为0。

为了完整,你也可以在算术上下文中使用命令replace…例如:

 $ 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 
 $ bash --version GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin13) $ true="true" $ unset false $ if [[ $true ]] ; then echo hi ; fi hi $ if [[ $false ]] ; then echo hi ; fi $ if [[ $true || $false ]] ; then echo hi ; fi hi $ if [[ $false || $true ]] ; then echo hi ; fi hi $ if [[ $false && $true ]] ; then echo hi ; fi $ if [[ $true && $false ]] ; then echo hi ; fi $ if [[ $true == $false ]] ; then echo hi ; fi $ if [[ $true == $true ]] ; then echo hi ; fi hi $ if [[ $false == $false ]] ; then echo hi ; fi hi` 

因为在bash中,0是真的,而0以外的东西都是假的。