還是回到我們的command line來吧...
經過前面兩章的學習,應該很清楚當你在shell prompt後面敲打鍵盤、直到按下Enter的時候,你輸入的文字就是command line了,然後shell纔會以行程的方式執行你所交給它的命令。但是,你又可知道:你在command line輸入的每一個文字,對shell來說,是有類別之分的呢?
簡單而言(我不敢說這是精確的定議,注一),command line的每一個charactor,分爲如下兩種:
* literal:也就是普通純文字,對shell來說沒特殊功能。
* meta:對shell來說,具有特定功能的特殊保留字符。
(注一:關於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?)
事實上,前兩章我們在command line中已碰到兩個幾乎每次都會碰到的meta:
* IFS:由<space>或<tab>或<enter>三者之一組成(我們常用space )。
* CR:由<enter>產生。
IFS是用來拆解command line的每一個詞(word)用的,因爲shell command line是按詞來處理的。而CR則是用來結束command line用的,這也是爲何我們敲<enter>命令就會跑的原因。除了IFS與CR,常用的meta還有:
=:設定變量。
$:作變量或運算替換(請不要與shell prompt搞混了)。
>:重導向(重定向)stdout。
<:重導向(重定向)stdin。
|:命令管線(管道)。
&:重導向file desCRiptor,或將命令置於背境(後臺)執行。
( ):將其內的命令置於nested subshell執行,或用於運算或命令替換。
{ }:將其內的命令置於non-named function中執行,或用在變量替換的界定範圍。
;:在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。
&&:在前一個命令結束時,若返回值爲true,繼續執行下一個命令。
||:在前一個命令結束時,若返回值爲false,繼續執行下一個命令。
!:執行history列表中的命令
...
假如我們需要在command line中將這些保留字符的功能關閉的話,就需要quoting處理了。
在bash中,常用的quoting有如下三種方法:
* hard quote:' ' (單引號),凡在hard quote中的所有meta均被關閉。
* soft quote:" " (雙引號),在soft quoe中大部份meta都會被關閉,但某些則保留(如$,反引號,反斜槓)。
* escape:/(反斜線),只有緊接在escape (跳脫字符)之後的單一meta才被關閉。
下面的例子將有助於我們對quoting的瞭解:
$ A=B C #空格鍵未被關掉,作爲IFS處理。 |