shell 腳本編程之引用

四種引用符

shell 中字符分爲兩種,一種是普通字符,另一種是元字符(meta)。元字符是 shell 的保留字符,在 shell 中有着特殊的意義。引用是指將字符串用某種符號括起來,以防止特殊字符被解析成其它意思。shell 中有四種引用符,用雙引號,單引號,反引號和轉義字符。

轉義字符 \

特殊字符無法直接輸出,因爲特殊字符會被解析成其特殊意義。比如要打印美元符號 $

[ljx@localhost ~]$ echo $17
7
[ljx@localhost ~]$ echo \$17
$17

第一條命令,$ 符號被解析成取變量的值,$1 取的是腳本的第一個參數,因爲這裏並沒有執行腳本,所以 $1 的值爲空,最後輸出的結果是7。正確的寫法是第二條命令,使用轉義字符 \ 來使特殊字符顯示爲字符本身。
除了 $ 符號,雙引號、單引號,反引號,星號,百分號,問號,感嘆號,分號,轉義符號,各種括號等等都是特殊字符,要使它們顯示爲字面的符號,就需要在前面加上轉義字符 \。

部分引用 “

轉義字符可以阻止單個字符被解析成特殊意義,但如果是字符串的話可以使用其它的引用方式。使用雙引號括起來的引用稱爲部分引用,又叫弱引用;顧名思義就是不是完全的引用。使用雙引號括起來的引用,$符,`符和 \ 符仍會被解析成特殊意義,其它字符都會被解析成字面意義。

[ljx@localhost ~]$ var="a    b     c"
[ljx@localhost ~]$ echo $var
a b c
[ljx@localhost ~]$ echo "$var"
a    b     c

可以看到,使用雙引用括起來之後,$ 符號仍被解析爲取變量的值。當變量的值中有連續多個空格時,直接輸出變量的值只會多個空格中的一個,如果想保留所有的空格,就需要使用引用的方式。

全引用 ‘

使用單引號括起來的引用稱爲全引用,又叫強引用;顧名思義就是完全的引用。包括 $符,` 符,\ 符在內的所有特殊字符都會被解析成字面意思。單引號引用內不能再出現單引號,因爲這樣引號配對就亂了,用轉義字符來轉義單引號也不行,因爲轉義字符在單引號引用內被解析成普通字符,轉義工作無法正常進行。

[ljx@localhost ~]$ echo '$PWD'
$PWD
[ljx@localhost ~]$ echo "$PWD"
/d/learn/shell
[ljx@localhost ~]$ echo 'It's a dog'
> '
Its a dog
[ljx@localhost ~]$ echo "It's a dog"
It's a dog
[ljx@localhost ~]$ echo It\'s a dog
It's a dog

使用單引號引用時,$ 被解析成普通字符,所以輸出結果爲 $PWD,使用雙引號引用時,$ 仍被解析成取變量值,所以輸出結果爲 /d/learn/shell。使用單引號引用將 It's a dog括起來,字符串中的單引號與第一個單引號配對了,所以就剩下了一個單引號沒法配對;當按下回車時命令並沒有執行,而是繼續等待輸入,繼續輸入一個單引號,命令才執行,輸出結果爲 Its a dog,中間的單引號被解析成引用了。正確的寫法是後面那兩種寫法。

命令替換 `

命令替換是指將系統命令的標準輸出作爲值賦給變量,使用反引號 ` 括起來的引用就是命令替換。除了反引號之外,還可以使用 $()。兩者的功能是等價的,但使用 $() 比 ` 會好點;一方面,反引號和單引號看起來太像了,難以區分;另一方面,$() 支持嵌套,而 ` 不支持。但是,$() 只有在 bash 中才有效,而 ` 在所有 unix shell 中都有效,因此反引號更加普遍。

[ljx@localhost ~]$ date1=`date`
[ljx@localhost ~]$ date2=$(date)
[ljx@localhost ~]$ echo $date1 $date2
2017073115:34:56 2017073115:35:02
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章