为什么$((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中返回状态的平等,它执行使用给出的文字,其中“假”与“真”被视为变量,但尚未约束的数字平等,这两者都是解释为0,因为他们没有尚未分配值:
$ echo $((true))
0
$ echo $((false))
0
如果要比较的真假返回状态,你想要的东西,如:但
true
TRUE=$?
false
FALSE=$?
if (($TRUE == $FALSE)); then echo TRUE; else echo FALSE; fi
,我不知道为什么你会想做t他的。
编辑:更正了关于“真”和“假”被解释为字符串的原始答案中的部分。他们不是。他们被视为变量,但没有任何价值约束他们呢。
因为在bash,0是真实的,0以外的一切都是假的。
好的,所以,似乎有很多关于什么$((...))
真的有什么困惑。
它确实操作数的算术评估,裸字是变量,而不是命令或字符串文字(即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
我已经提出这个答案,因为你正确地说@ zostay完全一样的东西,你只是不明白他的例子。你得到一个语法错误,因为TRUE和FALSE没有在你的shell中定义;他的完整示例DID将它们定义为true和false命令的数字返回代码(在另一个答案中更仔细地查看它上面的4行;“TRUE = $?”定义了变量$ TRUE等等。) – Izkata 2011-12-20 22:56:30
我为这个例子纠正了。但不,我不是说同样的事情:@zostay说'true'和'false'被视为字符串 - 这不是case_!它们被视为环境变量,它是一个完全不同的野兽,'$ true'和'$ false'评估为空字符串,而不是文字。尝试'echo $(($(echo $ a)))'其中'a'没有被定义:它不会产生语法错误,但会返回0.他正确地说,尽管如此,字符串评估为0。 ,在这种情况下,任何不是数字的值都是0。 – fge 2011-12-20 23:04:03
$ 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`
另外'回声$(($ TRUE == $ FALSE))'会报告如你所期望的那样。 'echo $(($ TRUE == $ TRUE))'和'echo $(($ FALSE == $ FALSE))'也会报告'1'。 – zostay 2011-12-20 17:44:23
这是正确的。 “真”和“假”,因为布尔没有存在于bash中,因此在$(())' – Sorpigal 2011-12-20 18:56:53
+ 1中没有特殊的含义,在所有其他答案中为-1,甚至没有其他人阅读这个问题? – Random832 2011-12-20 19:01:05