天天看點

shell 腳本程式設計之引用

四種引用符

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

轉義字元 \

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

[ljx@localhost ~]$ echo $17

[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
[[email protected] ~]$ 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
年月日 :: 年月日 ::
           

繼續閱讀