還是回到我們的command line來吧...
經(jīng)過前面兩章的學(xué)習(xí),應(yīng)該很清楚當(dāng)你在shell prompt后面敲打鍵盤、直到按下Enter的時候,你輸入的文字就是command line了,然后shell才會以行程的方式執(zhí)行你所交給它的命令。但是,你又可知道:你在command line輸入的每一個文字,對shell來說,是有類別之分的呢?
簡單而言(我不敢說這是精確的定議,注一),command line的每一個charactor,分為如下兩種:
* literal:也就是普通純文字,對shell來說沒特殊功能。
* meta:對shell來說,具有特定功能的特殊保留字符。
(注一:關(guān)于bash shell在處理command line時的順序說明,請參考O'Reilly出版社之Learning the Bash Shell, 2nd Edition,第177 - 180頁的說明,尤其是178頁的流程圖Figure 7-1 ... )
Literal沒甚么好談的,凡舉abcd、123456這些"文字"都是literal ... (easy?)
但meta卻常使我們困惑..... (confused?)
事實(shí)上,前兩章我們在command line中已碰到兩個幾乎每次都會碰到的meta:
* IFS:由<space>或<tab>或<enter>三者之一組成(我們常用space )。
* CR:由<enter>產(chǎn)生。
IFS是用來拆解command line的每一個詞(word)用的,因?yàn)?/span>shell command line是按詞來處理的。而CR則是用來結(jié)束command line用的,這也是為何我們敲<enter>命令就會跑的原因。除了IFS與CR,常用的meta還有:
=:設(shè)定變量。
$:作變量或運(yùn)算替換(請不要與shell prompt搞混了)。
>:重導(dǎo)向(重定向)stdout。
<:重導(dǎo)向(重定向)stdin。
|:命令管線(管道)。
&:重導(dǎo)向file desCRiptor,或?qū)⒚钪糜诒尘?/span>(后臺)執(zhí)行。
( ):將其內(nèi)的命令置于nested subshell執(zhí)行,或用于運(yùn)算或命令替換。
{ }:將其內(nèi)的命令置于non-named function中執(zhí)行,或用在變量替換的界定范圍。
;:在前一個命令結(jié)束時,而忽略其返回值,繼續(xù)執(zhí)行下一個命令。
&&:在前一個命令結(jié)束時,若返回值為true,繼續(xù)執(zhí)行下一個命令。
||:在前一個命令結(jié)束時,若返回值為false,繼續(xù)執(zhí)行下一個命令。
!:執(zhí)行history列表中的命令
...
假如我們需要在command line中將這些保留字符的功能關(guān)閉的話,就需要quoting處理了。
在bash中,常用的quoting有如下三種方法:
* hard quote:' ' (單引號),凡在hard quote中的所有meta均被關(guān)閉。
* soft quote:" " (雙引號),在soft quoe中大部份meta都會被關(guān)閉,但某些則保留(如$,反引號,反斜杠)。
* escape:\(反斜線),只有緊接在escape (跳脫字符)之后的單一meta才被關(guān)閉。
下面的例子將有助于我們對quoting的了解:
在第一次設(shè)定A變量時,由于空格鍵沒被關(guān)閉,command line將被解讀為:
* A=B然后碰到<IFS>,再執(zhí)行C命令在第二次設(shè)定A變量時,由于空格鍵被置于soft quote中,因此被關(guān)閉,不再作為IFS:
* A=B<space>C事實(shí)上,空格鍵無論在soft quote還是在hard quote中,均會被關(guān)閉。Enter鍵亦然:
$ A='B