为什么$((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:环境中没有true
或false
环境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以外的东西都是假的。