測試語句中 bash 中的字串和數字比較?

測試語句中 bash 中的字串和數字比較?

我不確定我正在做的比較:

   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 內建命令,但仍然是一個簡單命令,[[而是一個更改命令列解析的複合命令。

相關內容