1. 程式人生 > >shell轉義,單引號與雙引號,反撇號

shell轉義,單引號與雙引號,反撇號

http://www.cnblogs.com/mydomain/archive/2011/10/15/2213017.html

1、轉義

    單引號和雙引號都能關閉shell對特殊字元的處理。不同的是,雙引號沒有單引號嚴格,單引號關閉所有有特殊作用的字元,而雙引號只要求shell忽略大多數,具體的說,就是①美元符號②反撇號③反斜槓,這3種特殊字元不被忽略;不忽略美元符號意味著shell在雙引號內部也進行變數名替換。

1)單引號

硬轉義,單引號內的字元就是其字面意義。阻止shell進行變數替換和解釋特殊字元;對於後一種情況,單引號就是個轉義字元,類似於反斜線。

2)雙引號

會進行變數替換;將整個字串解釋為一個整體,即使引數裡面含有空白字元也不會被

shell分割開

3)反撇號,相當於$()--命令替換

會把命令執行的輸出,替換;相當於函式呼叫,巢狀的變數會一直解析

① shell命令用反引號或者$(...)結構括起來,其中,$(...)格式受到POSIX標準支援,也利於巢狀

② 反撇號內不能再引用反撇號,而$()中可以引用反撇號

③ 要把$()引用命令與${}引用變數區分開來

4)反斜線

用作轉義字元,阻止shell將後續字元解釋成特殊字元

2、示例

1)****/home/edwardlewis/altraman # echo 'date'

date

****:/home/edwardlewis/altraman # echo "date"

date

****:/home/edwardlewis/altraman # echo `date`

Fri Aug 19 07:00:02 CST 2011

2)在指令碼中:

a)newname=1.log_`date +%Y-%m-%d-%H-%M`

會輸出:1.log_2011-10-13-21-27

b)tme=move_data.log_'date +%Y-%m-%d-%H-%M'

echo ${tme}

輸出為:1.log_date +%Y-%m-%d-%H-%M

c)tme=move_data.log_"date +%Y-%m-%d-%H-%M"

echo ${tme}

輸出為:1.log_date +%Y-%m-%d-%H-%M

3、其他[3]

1)command line的每一個charactor,分為如下兩種:

*literal:普通純文字,對shell 來說沒特殊功能

*meta:對shell來說,具有特定功能的特殊保留字元

① IFS:由<space><tab><enter>三者之一組成,用來拆解 command line的每一個詞(word),因為command line 是按詞來處理的。

② CR:由<enter>產生。CR 用來結束 command line

③ =:設定變數。

④ $:作變數或運算替換

⑤ >:重導向 stdout

⑥ <:重導向 stdin

⑦ |:管道

⑧ &:後臺執行。

⑨ ():將其內的命令置於 巢狀子shell中執行,或用於運算或命令替換。

⑩ {}:將其內的命令置於non-named function中執行,或用在變數替換的界定範圍

11 ;:在前一個命令結束時,忽略其返回值,繼續執行下一個命令

12 &&:在前一個命令結束時,若返回值為 true,繼續執行下一個命令

13 ||:在前一個命令結束時,若返回值為false,繼續執行下一個命令。

14 !:執行 history 列表中的命令

2)假如需要在command line中將這些保留字元的功能關閉,就需要quoting處理。在bash中,常用的quoting 有三種方法:

① hard quote:' ' (單引號),在 hard quote 中的所有meta 均被關閉

② soft quote:" " (雙引號),在soft quoe 中大部份meta都會被關閉,除$,`,\

③ escape: \(反斜線),緊接 escape之後的單一meta被關閉