網路農夫 --  Home 網路農夫 --  Home
網路農夫 --  Home
wait.....

3-9-1 單引號( ' )的運用(single-quotes)

當我們以單引號來來括住數個以  space 字元所分格開來的字串時,最主要的目地便是將它們便成是一個單一的字串來運用。譬如說,在 UNIX 系統中,檔案名稱是允許使用 space 字元在當中的。像“data a1”這樣的檔名是合法的。但如果我們想將某個指令的輸出重導成“data a1”檔案,用一般的方式一定會產生錯誤的結果,如下:

8 % ls -l > data a1
a1 not found

像以上的語法使用“data a1”因為有 space 字元的分格而被當成是兩個獨立的字串,所以該指令的“data”與“a1”分別被 C shell 解譯成,“a1”是指令 ls -l 的檔案引數;“data”則是重導向的檔案名稱。如果該目錄下有檔案“a1”存在的話,該指令將不會有錯誤訊息傳出。而是成功地將“ls -l a1”的資料輸出重導到檔案“data”中。這指令的作用實際上已相差了十萬八千里。如果是使用在 C shell 程式設計中,這在 debug 上,可真的會累死人。當然像這種檔名上的特殊問題,一般是不會這樣做的。它的用義是想告訴讀者含有 space 字元的字串,在實際上是與一般有所差別的。一但使用觀念錯誤,可能會有相當麻煩的情況產生。這一點請多加注意。接下來我們再來看一個比較常碰到的情況。

 

當我們想到檔案“find.data”中,找出含有“Permission denied”的每一行時,如果我們用下面的方式來下指令:

9 % grep Permission denied find.data > datafile

實際上你所得到的結果將不是含有“Permission denied”的字串,而是僅含有“Permission”字串的每一行。而且在指令中的“denied”字串將會被 C shell 解譯為是指令 grep 的檔案引數,如果該目錄下沒有“denied”這個檔案,將會有像下面這樣的錯誤訊息輸出:

grep: denied: No such file or directory

要想正確地得到你所要的結果,以上的兩個指令可使用單引數來括住字串,便可解決上述的種種問題。如下:

10 % ls -l > 'data aa'
11 % grep 'Permission denied' find.data > datafile

另外我們也時常運用單引號在設定較複雜的別名上。如下:

alias psg 'ps axu | grep \!:1 | grep -v grep'

像如此的整個指令串的部份,必須用單引號來將它們括住,要不然在語法上會產生錯誤。當然在單引號之內,語法上也允許再使用像雙引號那樣的符號在裡面。如下面這個別名的設定的例子:

alias lsd ' ls -l | grep "^d" '

除此別名的設定之外,像指令 echo 也常會運用得上,如下面的情況:

12 % echo ID Title Name Note:
ID Title Name Note:

如果你使用 echo 指令要輸出一個帶有 TAB 字元的訊息。如上例你會發現,原本設定好的格式,在輸出時完全變了。這是因為 C shell 處理指令後的引數,並不認識 TAB 字元,僅僅會讀入引數本身。輸出結果時各個引數之間則用一個 space 字元來加以區格開來。所以造成像上面這樣的結果。如果你使用單引號括住,情況便會有所改變。請看下面的例子:

12 % echo 'ID Title Name Note::'
ID Title Name Note::

因為有單引號括住的原因,使得四個引數及它們之間的 TAB 字元,合為一體,形成為同一個引數。指令的輸出,便因此而保留了 TAB 字元,輸出結果才會與原來的格式相同。另外一點值得一提的是,變數的符號“$”在單引號內是無法發揮變數作用的,它將僅僅是一個普通的字元,而無任何的特殊意義。如下所示:

3 % set d = date
4 % echo $d
date
5 % echo 'variable $d'
variable $d

關於此一特性,請特別牢記在心。因為這也就是單引號有別於雙引號在運用上的最大差別處。

 

版本:Beta-2001-05 -- 網路農夫