SHELL十三問之四:雙引號與單引號差別在哪?

 

還是回到我們的command line來吧...

Tcxa+|(H3O'}Y1

經過前面兩章的學習,應該很清楚當你在shell prompt後面敲打鍵盤、直到按下Enter的時候,你輸入的文字就是command line了,然後shell纔會以行程的方式執行你所交給它的命令。但是,你又可知道:你在command line輸入的每一個文字,對shell來說,是有類別之分的呢?

.ML)IX�}3dGo U~1


l'@}_`4V$?1
簡單而言(我不敢說這是精確的定議,注一)command line的每一個charactor,分爲如下兩種:
%z�BtQ4/X^B1
* literal:也就是普通純文字,對shell來說沒特殊功能。
qrqQD,s o;U1
* meta:對shell來說,具有特定功能的特殊保留字符。

!n)e}?[1


f7i5CM jz@1q1
(注一:關於bash shell在處理command line時的順序說明,請參考O'Reilly出版社之Learning the Bash Shell, 2nd Edition,第177 - 180頁的說明,尤其是178頁的流程圖Figure 7-1 ... )
V2J(x-D'w(F)v /"]:`1BSD愛好者樂園?!N�{{];~3pF
Literal沒甚麼好談的,凡舉abcd123456這些"文字"都是literal ... (easy)

-w.uip.r1

meta卻常使我們困惑..... (confused?)

*LBHnk7pU*y%r1

事實上,前兩章我們在command line中已碰到兩個幾乎每次都會碰到的metaBSD愛好者樂園$}7p A V0_,T
* IFS:由<space><tab><enter>三者之一組成(我們常用space )BSD愛好者樂園*d%R&Dz2A y T(ah*P
* CR:由<enter>產生。

{Q` V1D$^�C^1


4vk9[j3@1C1o1
IFS是用來拆解command line的每一個詞(word)用的,因爲shell command line是按詞來處理的。而CR則是用來結束command line用的,這也是爲何我們敲<enter>命令就會跑的原因。除了IFSCR,常用的meta還有:BSD愛好者樂園*hg2t'`8}p
=設定變量。
A#/Y onCJ S/|1
$作變量或運算替換(請不要與shell prompt搞混了)BSD愛好者樂園�t{u+r}0`zy
>:重導向(重定向)stdoutBSD愛好者樂園 c6IDX$qW+b(K,QG^
<:重導向(重定向)stdin
0o6V4bdL G d?1
|命令管線(管道)BSD愛好者樂園0U hn)V}|
&:重導向file desCRiptor,或將命令置於背境(後臺)執行。
:`(}'a4Wh-_'C&Uf@1
( ):將其內的命令置於nested subshell執行,或用於運算或命令替換。BSD愛好者樂園5gp N+f i'R
{ }:將其內的命令置於non-named function中執行,或用在變量替換的界定範圍。
/-Xl2W Y-q;f1
;:在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。
a+D/z/}vE E1
&&:在前一個命令結束時,若返回值爲true,繼續執行下一個命令。
n:U2nu4j/WM6x1K8C1
||:在前一個命令結束時,若返回值爲false,繼續執行下一個命令。
"cS%]V4n/I)c1
!:執行history列表中的命令BSD愛好者樂園1A.fy0Y`QR
...

-l4j)vceA1

 BSD愛好者樂園H*~e)e!_9S T[5o;b(]

假如我們需要在command line中將這些保留字符的功能關閉的話,就需要quoting處理了。BSD愛好者樂園 Gv(l/nu1T

bash中,常用的quoting有如下三種方法:BSD愛好者樂園`r7wEq-T
* hard quote' ' (單引號),凡在hard quote中的所有meta均被關閉。BSD愛好者樂園I v"h6_/axIm
* soft quote" " (雙引號),在soft quoe中大部份meta都會被關閉,但某些則保留($,反引號,反斜槓)BSD愛好者樂園y0m$}"xW-s&Z)N
* escape/(反斜線),只有緊接在escape (跳脫字符)之後的單一meta才被關閉。
/D-FU0rO L*w-xa1BSD愛好者樂園KFc)[N-yH
下面的例子將有助於我們對quoting的瞭解:BSD愛好者樂園%t }F,Ar+j1WG

BSD愛好者樂園7/8eS4I*/B+u[F

 

$ A=B C       #空格鍵未被關掉,作爲IFS處理。
F|/`$^/S5wM1
$ C: command not found.
%s%eG|G!]:cC1
$ echo $ABSD愛好者樂園 e}%V `!iK
BSD愛好者樂園n8qf%D`/Q FN
$ A="B C"       #空格鍵已被關掉,僅作爲空格鍵處理。BSD愛好者樂園4l3xl!J^F f:{B
$ echo $A
A pIO$eW1
B CBSD愛好者樂園*]2D2`4lvG

BSD愛好者樂園-c~^-A+O6ic _/Up

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章