2011-12-20 85 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

相關問題