本篇文章介紹在 Linux bash shell 中,用 $
獲取變量值時,是否要加雙引號、是否要加大括號。git
在 bash shell 腳本中,用 $
來獲取變量值時,有一些不加雙引號,例如 $arg
。有一些會加雙引號,例如 "$arg"
。
下面具體說明這兩種形式之間的區別,什麼狀況下要加雙引號,什麼狀況能夠不加雙引號。shell
在 bash 中,各個參數之間默認用隔開。
當參數值自己就帶有空格時,若是不加雙引號把參數值括起來,那麼這個參數值可能會被擴展爲多個參數值,而丟失本來的完整值。
具體舉例說明以下:bash
$ function test_args() { echo \$\#: $#; echo first: $1; echo second: $2; } $ args="This is a Test" $ test_args $args $#: 4 first: This second: is $ test_args "$args" $#: 1 first: This is a Test second:
這裏定義了一個 test_args 函數,打印傳入的 $1
、$2
參數值。
所給的 args 變量指定的字符串含有空格。函數
能夠看到,當執行 test_args $args
時,args 變量的值被空格隔開成四個參數。
而執行 test_args "$args"
時,args 變量的值保持不變,被當成一個參數。
使用雙引號把字符串括起來,能夠避免空格致使單詞拆分。ui
即,當咱們須要保持變量自己值的完整,不想被空格擴展爲多個參數,那麼就須要用雙引號括起來。code
在給腳本或函數傳遞參數時,咱們可能不肯定獲取到的參數值是否帶有空格。
爲了不帶有空格致使不預期的單詞拆分,形成參數個數發生變化,建議傳參時每一個參數都使用雙引號括起來。字符串
在 bash shell 腳本中,用 $
來獲取變量值時,有一些不加大括號,例如 $var
。有一些會加大括號,例如 ${var}
。
下面具體說明這兩種形式之間的區別,什麼狀況下要加大括號,什麼狀況能夠不加大括號。it
查看 man bash 裏面對 ${parameter}
表達式的含義說明以下:io
${parameter}
The value of parameter is substituted.
The braces are required when parameter is a positional parameter with more than one digit, or when parameter is followed by a character which is not to be interpreted as part of its name.
The parameter is a shell parameter or an array reference (Arrays).
即,大括號 {}
的做用是限定大括號裏面的字符串是一個總體,不會跟相鄰的字符組合成其餘含義。function
例如,有一個 var 變量值是 "Say",如今想打印這個變量值,並跟着打印 "Hello" 字符串,也就是打印出來 "SayHello" 字符串。
那麼獲取 var 變量值的語句和 "Hello" 字符串中間就不能有空格,不然 echo 命令會把這個空格一塊兒打印出來。
可是寫爲 $varHello
達不到想要的效果。
具體舉例以下:
$ var="Say" $ echo $var Hello Say Hello $ echo $varHello $ echo ${var}Hello SayHello $ echo "$var"Hello SayHello
能夠看到,$var Hello
這種寫法打印出來的 "Say" 和 "Hello" 中間有空格,不是想要的結果。
而 $varHello
打印爲空,這實際上是獲取 varHello 變量的值,這個變量沒有定義過,默認值是空。 ${var}Hello
打印出了想要的結果,用 {}
把 var 括起來,明確指定要獲取的變量名是 var,避免混淆。 "$var"Hello
用雙引號把 $var
括起來,也能夠跟後面的 "Hello" 字符串區分開。
即,當用 $
獲取變量值時,若是變量名後面跟着空白字符,隔開了其餘內容,能夠不用大括號來把變量名括起來。
若是變量名後面直接跟着不屬於變量名自身的其餘字符,就須要用大括號把變量名括起來,以便明確該變量的名稱。