Bash

shell腳本“if”語句中引用變數的區別?

  • May 24, 2020

這兩個 Bash if 語句有什麼區別?例如

if [ "$FOO" = "true" ]; then

對比

if [ $FOO = "true" ]; then

有什麼不同?似乎這兩種說法都是一樣的。

如果 的值$FOO是一個不包含萬用字元的單詞\[*?,那麼兩者是相同的。

如果$FOO未分配、為空或多個單詞(即,包含空格或$IFS),則未引用的版本是語法錯誤。如果它恰好是正確的單詞序列(例如0 -eq 0 -o false),則結果可能是任意的。因此,最好總是在 shell 腳本中引用變數。

順便說一句,"true"不需要引用。

為了說明它可能導致什麼問題,這裡舉幾個例子。

假設我們有兩個變數如下:

FOO="some value"
BAR="some value"

現在我們有兩個變數持有完全相同的字元串/值。如果我們做了一些 if 語句來測試結果,在你的情況下:

if [ $FOO = "$BAR" ]; then echo "match"; else echo "no match"; fi

此時你會得到bash: [: too many arguments. 未加引號的 $FOO 現在包含三個值,即'[ , some , value'. [test 關鍵字不知道要執行什麼,因為它期望第一個或第二個參數是一個運算符。

當我們引用 “$FOO” 時,我們明確告訴if要查看不發生分詞的正確值。

另一個例子:

my_file="A random file.txt"
  • rm $my_file意味著刪除 ‘A’ ‘random’ ‘file.txt’ 這使它成為三個文件。
  • 這樣做rm "$my_file"將刪除生成一個文件的“A random file.txt”。

希望我沒有把你和這些例子混淆。

引用自:https://unix.stackexchange.com/questions/86800