2011-12-20 119 views
46

为什么bash有以下行为?

echo $((true == false)) 
1 

我还以为这将打印0,但它打印1

这是由以下事实进一步复杂化:

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

回答

56

所有关于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他的。

编辑:更正了关于“真”和“假”被解释为字符串的原始答案中的部分。他们不是。他们被视为变量,但没有任何价值约束他们呢。

+0

另外'回声$(($ TRUE == $ FALSE))'会报告如你所期望的那样。 'echo $(($ TRUE == $ TRUE))'和'echo $(($ FALSE == $ FALSE))'也会报告'1'。 – zostay 2011-12-20 17:44:23

+0

这是正确的。 “真”和“假”,因为布尔没有存在于bash中,因此在$(())' – Sorpigal 2011-12-20 18:56:53

+1

+ 1中没有特殊的含义,在所有其他答案中为-1,甚至没有其他人阅读这个问题? – Random832 2011-12-20 19:01:05

-2

因为在bash,0是真实的,0以外的一切都是假的。

21

好的,所以,似乎有很多关于什么$((...))真的有什么困惑。

它确实操作数的算术评估,裸字是变量,而不是命令或字符串文字(即true真的$true),以及什么这是不是一个数字是0==运算符比较两个数字,如果它们相等则返回1。

这就是为什么$((true == false))为1:存在的环境中,这意味着既$true$false评价为空字符串,没有truefalse环境变量,因此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 
+0

我已经提出这个答案,因为你正确地说@ zostay完全一样的东西,你只是不明白他的例子。你得到一个语法错误,因为TRUE和FALSE没有在你的shell中定义;他的完整示例DID将它们定义为true和false命令的数字返回代码(在另一个答案中更仔细地查看它上面的4行;“TRUE = $?”定义了变量$ TRUE等等。) – Izkata 2011-12-20 22:56:30

+0

我为这个例子纠正了。但不,我不是说同样的事情:@zostay说'true'和'false'被视为字符串 - 这不是case_!它们被视为环境变量,它是一个完全不同的野兽,'$ true'和'$ false'评估为空字符串,而不是文字。尝试'echo $(($(echo $ a)))'其中'a'没有被定义:它不会产生语法错误,但会返回0.他正确地说,尽管如此,字符串评估为0。 ,在这种情况下,任何不是数字的值都是0。 – fge 2011-12-20 23:04:03

-1
$ 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` 
+1

欢迎来到SO!你的代码和输出的一些解释会让你的答案对人们更有用。 – J0e3gan 2014-11-07 02:55:58

+0

你所做的只是显示代码和行为。你不解释为什么这个代码工作。代码倾销通常在这里被压制! – rayryeng 2014-11-21 03:20:39

相关问题