咱們知道,在一個shell命令是由命令名和它的參數組成的, 好比 cat testfile
, 其中cat
是命令名, testfile
是參數. shell將參數testfile
傳遞給cat
命令. 可是, 若是參數中含有特殊字符, 好比說*
, *
咱們知道,是表示任意多個(包括0個)任意字符. 那麼shell的工做方式是,它會對這些特殊字符進行預先處理, 而後再將處理的結果傳給那個命令.
好比說,若是你的當前目錄有file, file1, file2 三個文件, 那麼當你執行cat file*
的時候, shell會對參數部分file*
進行預先處理, 因爲*
表示任意多個(包括0個)任意字符,那麼處理的結果即是file file1 file2
,接下來,shell再將這個結果, 即file file1 file2
傳遞給cat命令, 因此你看到的結果跟直接執行cat file file1 file2
是同樣的, 那就是三個文件的內容都顯示在命令行終端.
實際上,咱們有辦法看到shell處理的結果是什麼,或者說真正執行的命令是什麼樣子的, 那就是在你要執行的命令以前加上echo
.
好比說,在上面的目錄下,你執行echo cat file*
, 那麼你將看到html
cat file file1, file2
上面那條命令,就是通過shell對參數的處理以後,真正執行的命令.
可是不少時候,咱們但願傳遞給這些命令的,就是這些參數自己, 好比說,你當前目錄下有一個文件的文件名就叫test*
, 同時還有另一個文件, test1
. 而你只想看test*
的內容, 這時候,若是你執行cat test*
的話,那麼test*
和test1
的內容都會被顯示出來,這時候怎麼辦呢? 這裏就涉及到特殊字符的轉義(escape)的問題了.所謂的轉義,意思就是去掉它的特殊含義.讓shell把他們當作通常字符對待,不要進行特殊處理.
在shell中,特殊字符的轉義有三種辦法git
用\
轉義: 把\
字符放在特殊字符的前面github
用單引號('')轉義: 用單引號把參數括起來正則表達式
用雙引號("")轉義: 用雙引號把參數括起來shell
在上面的例子中,這三種方法都是有效率的,也就是說,下面的三個命令都能達到目的:數組
cat test\*
this
cat 'test*'
命令行
cat 「test*」
code
在shell中,特殊字符是很是多的,而以上提到的三種轉義方法的範圍也不盡相同,其中第一種方法的範圍是最廣的,幾乎能夠對全部的特殊字符進行轉義,常見的用法是把\
放在一個命令行的最後,這樣一個很長的命令就能夠分爲兩行或者更多行寫. 好比htm
echo this is a \ very long \ line
將顯示成
this is a very long line
在這裏,其實就是\
把換行符轉義了,讓它失去了換行的意思,同時阻止命令馬上執行.
第二種轉義(單引號)的範圍比第一種小,它能夠阻止命令行馬上執行,可是它不能讓換行符失去換行的意思. 因此
echo 'hello world'
將顯示成
hello world
第三種轉義(雙引號)的範圍又比第二種小,單引號能夠轉義"`", 而雙引號不行. 在shell中, "`"中間的東西將被視爲命令替換. shell對參數進行預先處理時,將把兩個"`"中間的東西當作shell命令進行執行,再將執行結果替換掉他們自己. 舉個例子:
echo today is `date`
將顯示
today is Mon Oct 12 16:14:16 CST 2015
固然,具體的日期跟你執行這條命令的時期有關. 總之,意思你應該明白了. 再回到原來的問題,咱們說單引號能夠轉義"`", 而雙引號不行, 意思就是,單引號之間的"`"將失去它的特殊含義,而雙引號之間的"`"將依然有特殊含義,因此
echo 'today is `date`'
將顯示
today is `date`
而
echo 「today is `date`」
將顯示
today is Mon Oct 12 16:23:23 CST 2015
*
任意個任意字符 ?
一個任意字符 [..]
[]
中的任意一個字符,這裏也相似於正則表達式,中括號內能夠是具體的一些字符,如[abcd]
也能夠是用-
指定的一個範圍,如[a-d]
#
註釋
(空格) 參數分隔符 cmd
命令替換 |
管道 &
後臺執行 ;
命令分隔符(能夠在同一行執行兩個命令,用;
分割)
~ 用戶home目錄
最後記得,任什麼時候候,你不肯定本身是否是轉義對了,或者是特殊字符用對了,記得能夠在命令前面加上echo
,來看看真實執行的命令是怎麼樣的.
本文參考文檔: http://www.grymoire.com/Unix/Quote.html
有任何意見或建議,或者發現文中任何問題,歡迎留言!