Bash
shell腳本“if”語句中引用變數的區別?
這兩個 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”。希望我沒有把你和這些例子混淆。