2017-06-12 73 views
0

我試圖理解爲什麼一個未設置的變量被評估爲0. 在一些腳本中,即時編寫變量將只在需要時設置,並且一些時間不會。 所以這種行爲將導致不正確的輸出。 是否意味着我必須預設所有變量或至少添加檢查它們是否已設置?爲什麼一個未設置的變量在bash中被評估爲0如果語句

#!/bin/bash 
#myvalue=0 #comment to simulate an unset variable. 

if [[ $myvalue -eq 0 ]] ; then 
    echo "OK" 
fi 

結果與OK:

bash -x test.sh 
+ [[ '' -eq 0 ]] 
+ echo OK 
OK 
+0

嘗試'如果[$ myvalue -eq 0];然後' –

+0

我不能使用-eq和[] only [[]],我使用它,因爲我需要評估一個數字。 –

+1

當然你可以用'-eq'和'[';事實上,你是否應該使用'[[... -eq ...]]'是有爭議的,因爲你可以使用更易讀的'((... == ...))''代替。 – chepner

回答

3

-eq運營商內部[[ ... ]],因爲它僅適用於整數值,觸發其操作數的算術評估。在算術表達式中,尚未設定的變量默認爲0算術評估的一個比較明顯的示範:

$ if [[ 3 -eq "1 + 2" ]]; then echo equal; fi 
equal 

注意,在你的榜樣,你甚至都不需要首先擴展參數;算術評估會爲你做它:

$ if [[ myvalue -eq 0 ]]; then echo equal; fi 
equal 
$ myvalue=3 
$ if [[ myvalue -eq 3 ]]; then echo equal; fi 
equal 

此外,這是特有的bash[[ ... ]]命令。使用POSIX [,-eq不會觸發算術評估。

$ if [ "$myvalue" -eq 0 ]; then echo equal; fi 
bash: [: : integer expression expected 
$ if [ myvalue -eq 0 ]; then echo equal; fi 
bash: [: myvalue: integer expression expected 
+0

我想這就是你寫的答案「在算術表達式中,未設置的變量默認爲0」。我不知道。也是在男人bash中尋找這樣的信息,但沒有找到它。 –

+0

在手冊頁的ARITHMETIC EVALUATION部分中,有一句話「如果沒有使用參數 擴展語法,則在名稱引用時,空值或未設置的shell變量的值爲0。」據我所知,事實上數字比較運算符觸發算術評估實際上沒有記錄。 – chepner

+0

(我認爲'$ myvalue',而不僅僅是'myvalue',當unset被視爲'$ myvalue'可能無意的副作用時,不會根據[[..]中的常規規則進行擴展。 。]]'。) – chepner

0

如果你想要的字面值是比較使用的=代替-eq

if [[ $myvalue = 0 ]] ; then 
    echo "OK" 
fi 

如果Arg1等於0算術二元運算符(-eq)返回true,這是$myvalue,是否設置爲0或根本沒有設置... ''爲空,相當於零。

相關問題