
我不確定我正在做的比較:
if [ "$exit_status" -eq 0 ];then
#some statements
fi
這種比較數字或引號的正確方法是否使變數exit_status
成為與 0 比較的字串。
答案1
是的,這是正確的。
shell 中的引號與其他語言中的引號有著不同的用途。看這個答案更多細節。
在 shell 中,引號用於防止 shell 特殊處理某些字符,並防止 shell 對某些類型的擴展執行某些操作(例如本例中的變數擴展)。
通常,在這種情況下,您希望"$exit_status"
擴展到[
命令的一個參數,即該變數的內容,因此您需要引號。
答案2
[ "$exit_status" -eq 0 ]
如果 $exit_status 僅包含數字,則正確,並且您也可以刪除引號(只要 IFS 不包含數字)。
如果 x 為空或未設置,[ "$x" -eq 6 ]
則會導致錯誤,但[[ "$x" -eq 6 ]]
不會:
$ x=; [ "$x" -eq 6 ]
-bash: [: : integer expression expected
$ unset x; [ "$x" -eq 6 ]
-bash: [: : integer expression expected
$ x=; [[ "$x" -eq 6 ]]
$ unset x; [[ "$x" -eq 6 ]]
$
算術運算子去除空格:
$ [ '6 ' -eq $'\n\t6' ]; echo $?
0
在 [[ 內部,算術運算子的操作數是算術表達式,因此 example[[ 4 -eq 2+2 ]]
為 true。以 0 開頭的數字被視為八進制數:
$ [[ 010 -eq 8 ]]; echo $?
0
$ [ 010 -eq 8 ]; echo $?
1
我甚至經常使用 = / == 來比較整數。 = 和 == 在 bash 中的 [[ 和 [ 中是等價的。 == 和 [[ 不是由 POSIX 定義的。
[[ 內部不執行分詞和路徑名擴展。[[ $x = $y ]]
將 y 視為模式,但[[ $x = "$y" ]]
按字面意思對待 y:
$ x=44; y='4*'
$ [[ $x = $y ]]; echo $?
0
$ [[ $x = "$y" ]]; echo $?
1
答案3
但引用數字並沒有多大用處。如果參數值是數字,那麼引號不會改變任何內容,如果不是,那麼 if 無論如何都會失敗。好吧,並非在所有情況下:
exit_status="a = a -o 0"; [ "$exit_status" -eq 0 ] # returns false
exit_status="a = a -o 0"; [ $exit_status -eq 0 ] # returns true
這是因為[
它是 bash 內建命令,但仍然是一個簡單命令,[[
而是一個更改命令列解析的複合命令。