一、單引號""
目的: 為了保護文字不被轉換.除了他本身. 就是說除去單引號外, 在單引號內的所有文字都是原樣輸出.
1. [root@jszwl161 SP49EP9]# echo '$*><!'
$*><!
2. [root@jszwl161 SP49EP9]# echo 'she is crying: "help"'
she is crying: "help"
3. [root@jszwl161 SP49EP9]# echo '\\\\'
\\\\
4. [root@jszwl161 SP49EP9]# echo 'hah 'test''
hah test #略去了所有'
5. [root@jszwl161 SP49EP9]# echo ' today is `date`'
today is `date` #反引號在此無法實現函數功能.
二、雙引號""
目的: 為了包含文字或者函數段. 除了本身,反引號內的函數,$開頭的變量和\開頭反轉換的字符外, 其余都是直接輸出.
1. [root@jszwl161 SP49EP9]# echo "today is `date`"
today is Fri Jul 4 08:03:34 GMT 2008
2. [root@jszwl161 SP49EP9]# echo "today is 'date'"
today is 'date'
3. [root@jszwl161 SP49EP9]# echo "\\\\"
\\
4. [root@jszwl161 SP49EP9]# echo "test "test""
test test
三、反引號`
目的是為了在雙引號內保持函數轉換. 但單引號內其無作用.
1. [root@jszwl161 SP49EP9]# echo "today is `date`"
today is Fri Jul 4 08:03:34 GMT 2008 #將函數date轉換.
2. [root@jszwl161 SP49EP9]# echo ' today is `date` '
today is `date` #在單引號內無作用.
四、轉義符\
有時候,我們想讓 通配符,或者元字符變成普通字符,不需要使用它。那么這里我們就需要用到轉義符了。 shell提供轉義符有三種。
\后跟的是非元字符,與沒有加\的效果一樣
eg:echo '\A' 和echo "\A" 的輸出都是 \A 而echo \A 的輸出卻是A
補充:
(1)linux shell通配符(wildcard)
通配符是由shell處理的(不是由所涉及到命令語句處理的,其實我們在shell各個命令中也沒有發現有這些通配符介紹), 它只會出現在 命令的“參數”里(它不用在 命令名稱里, 也不用在 操作符上)。當shell在“參數”中遇到了通配符時,shell會將其當作路徑或文件名去在磁盤上搜尋可能的匹配:若符合要求的匹配存在,則進行代換(路徑擴展);否則就將該通配符作為一個普通字符傳遞給“命令”,然后再由命令進行處理。總之,通配符 實際上就是一種shell實現的路徑擴展功能。在 通配符被處理后, shell會先完成該命令的重組,然后再繼續處理重組后的命令,直至執行該命令。
需要說明的是:通配符看起來有點象正則表達式語句,但是它與正則表達式不同的,不能相互混淆。把通配符理解為shell 特殊代號字符就可。而且涉及的只有,*,? [] ,{} 這幾種。
(2)shell元字符(特殊字符 Meta)
shell 除了有通配符之外,由shell 負責預先先解析后,將處理結果傳給命令行之外,shell還有一系列自己的其他特殊字符。
加入”*” 都是作用在命令名直接。可以看到shell 元字符,基本是作用在命令上面,用作多命令分割(或者參數分割)。因此看到與通配符有相同的字符,但是實際上作用范圍不同。所以不會出現混淆。
小結:
單引號:被單引號用括住的內容,將被視為單一字串。在引號內的代表變數的$符號,沒有作用,也就是說,他被視為一般符號處理,防止任何變量替換。
雙引號:被雙引號用括住的內容,將被視為單一字串。它防止通配符擴展,但允許變量擴展。這點與單引數的處理方式不同。
反引號:在前面的單雙引號,括住的是字串,但如果該字串是一列命令列,會怎樣?答案是不會執行。要處理這種情況,我們得用反單引號來做。
fdv=`date +%F`echo "Today $fdv"
在倒引號內的 date +%F 會被視為指令,執行的結果會帶入 fdv 變數中。