2015-10-19 72 views
1

我可以看到一些文章,如this,其中提到「-eq」用於比較整數,但這並不表示我們不能使用「==」來比較整數。哪個比較好用「==」或「-eq」比較bash shell中的整數?

我對bash shell進行了本地驗證,「==」工作正常。 所以任何人都可以讓我幫忙瞭解哪個更好的選擇使用,如果「-eq」那麼爲什麼?

+0

即使是字符串,''==是不是裏面'[]'最佳實踐; POSIX sh標準僅指定'='。 Bash支持'==',但這是一個擴展,並且使用它的腳本可能與所有其他POSIX shell不兼容。 –

+0

@CharlesDuffy所以'=='a「bashism」? – amdixon

+0

@amdixon,正確。 –

回答

5

要比較整數,請使用-eq。區別在於==比較字符串值,而-eq比較數字值。這裏是它們產生不同的結果的一個示例:

$ [ 03 = 3 ] ; echo $? 
1 
$ [ 03 -eq 3 ] ; echo $? 
0 

它是使用[[相同:

$ [[ 03 == 3 ]] ; echo $? 
1 
$ [[ 03 -eq 3 ]] ; echo $? 
0 

爲數字,03等於3。但是,作爲字符串033是不同的。

摘要: 要爲相等比較數值,使用-eq

+0

順便說一句 - 我發現有必要添加我自己的答案只有幾個原因:沒有提及數學上下文(在這種情況下'=='是正確的),暗示'=='是在' [[]]'即使是字符串(但是當使用'[]'時導致POSIX不符合習慣)。 –

2

這取決於上下文。在數學上下文中(如果你正在爲bash編寫腳本,那麼最好使用==)。

((foo == 3))  ## foo = 3 would be an assignment here, and foo -eq 3 an error 

數學上下文也存在於其他情況下 - 例如,索引到非關聯數組,使得==優選但-eq非法在下面contrieved例如:

foo=(yes no) 
bar=3 
echo "${foo[bar == 3 ? 0 : 1]}" # echoes "yes" 

[[ ]]中,使用-eq

[[ $foo -eq 3 ]] ## $foo = 3 would be a string comparison here; $foo == 3 is a synonym, 
        ## but bad finger-memory to have if one wants to write POSIX code 
        ## elsewhere. 

[ ],使用-eq - 也報價:

[ "$foo" -eq 3 ] ## = would be a valid string comparison here; == would be a 
        ## POSIX-incompatible string comparison here; -eq is correct.