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
2023年07月31日 15:34
:562023年07月31日 15:35
:02
Shell指令碼程式設計 引用
1 引用的概念 關掉乙個字元的特殊意義稱為 引用 通常有一下三種方式 1 使用反斜槓字元 2 使用單引號 3 使用雙引號 shell中的部分元字元 new line space tab 2 使用 來引用,如echo hello world會提示world找不到這個命令,而使用echo hello w...
Shell指令碼程式設計之Shell函式
1.linux shell可以使用者定義函式,然後在shell指令碼中可以隨便呼叫 shell中函式的定義格式如下 function funname 1 可以帶function fun 定義,也可以直接fun 定義,不帶任何引數 2 引數返回,可以顯示加 return返回,如果不加,將以最後一條命令...
Shell指令碼程式設計之Shell陣列
1.bash支援一維陣列 不支援多維陣列 並且沒有限定陣列的大小 1 定義陣列 array name value0 value1 value2 value3 或者array name value0 value1 value2 value3 或者單獨定義 2 讀取陣列 使用 符號可以獲取陣列中的所有元...