Bash技巧:詳解用$獲取變量值是否要加雙引號或者大括號

本篇文章介紹在 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" 字符串區分開。

即,當用 $ 獲取變量值時,若是變量名後面跟着空白字符,隔開了其餘內容,能夠不用大括號來把變量名括起來。

若是變量名後面直接跟着不屬於變量名自身的其餘字符,就須要用大括號把變量名括起來,以便明確該變量的名稱

相關文章
相關標籤/搜索