爲什麼bash有以下行爲?
echo $((true == false))
1
我還以爲這將打印0
,但它打印1
。
這是由以下事實進一步複雜化:
> echo $((true))
0
> echo $((false))
0
> echo $((true == true))
1
> echo $((false == false))
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