Unix 指南/解釋/引用和檔名擴充套件
Shell 識別幾個特殊字元。以下是特殊字元
- \ (反斜槓)
- " (雙引號)
- ' (單引號)
- # {數字符號、磅符號或井號)
- $ (美元符號)
- ` (反引號)
- ~ (波浪號)
- { 和 } (大括號或花括號)
- ( 和 ) (圓括號)
- * (星號、星號或星號)
- ? (問號)
- < (小於號)
- > (大於號)
- & (和號)
- | (管道)
- ; (分號)
- ! (感嘆號或感嘆號)
除了感嘆號外,它們都是 Bourne Shell 中的特殊字元。然而,許多 Bourne 和非 Bourne Shell 也將感嘆號作為特殊字元。當 Shell 看到特殊字元時,它會執行比簡單地執行你鍵入的命令更復雜的操作。
一些特殊字元會觸發替換,命令的一部分會被替換成其他文字。一種常見的替換形式是檔名擴充套件,這在鍵入較長的檔名和檔名列表時可以節省工作。
要測試替換,我們需要echo命令。此命令只是回顯其引數(包括 Shell 對引數進行的任何更改)。除了“-n”之外,所有選項都被忽略。
$ echo -lnQ arg1 arg2 arg3 -lnQ arg1 arg2 arg3
引用用於保留特殊字元的字面含義。
以下是一個關於幾種型別引用的示例,這些示例將在本節的其餘部分中引用(其中有很多不必要的東西,你應該在閱讀完本節後找到它們,但它們用於示例)
$ echo There is \"a small possibility\" that '/etc/*tab' are " not " text and a backslash will not be printed after this. \\ There is "a small possibility" that /etc/*tab are not text and a backslash will not be printed after this. \
反斜槓(\)只是阻止 Shell 認為某些字元是特殊的。在上面的示例中,它用於按字面意義列印雙引號字元。
要列印反斜槓,請連續使用兩個反斜槓。
現在需要特殊 Shell 字元作為輸入的命令將起作用。
成對字元會影響它們之間的任何內容。
單引號會阻止所有擴充套件,從而保留所有字元的字面含義。
在示例中,單引號用於阻止 * 擴充套件。
單引號不能用在單引號中。任何第二個單引號都會終止第一個單引號,而第三個單引號則開始下一對單引號。
雙引號類似於單引號,但不會保留 $, \ (當後面跟著美元符號、反引號、雙引號或反斜槓時)和 ` 的字面含義。
在示例中,雙引號用於保留空格的字面含義。
檔名擴充套件使用以下字元來避免鍵入很長的檔案列表
* ? { }
Shell萬用字元 * 和 ? 用於構成模式。Shell 會搜尋與模式匹配的現有檔案並進行替換。
- *匹配 0 個或多個字元,除了 /
- ?匹配除 / 之外的任何一個字元
當匹配到多個檔案時,這些檔案用空格隔開,作為單獨的引數。
例如,/etc/ss*表示所有在/etc目錄中以字母ss開頭的檔案。echo 命令演示了替換。結果可能因你的系統而異,具體取決於你擁有的檔案。
$ echo /etc/ss* /etc/ssh /etc/ssl
echo 命令之所以這樣做,是因為它認為你運行了echo /etc/ssh /etc/ssl。Shell 用這些名稱替換了/etc/ss*。雖然/etc/ssh/ssh_config在許多系統上都存在,但它沒有出現在上面,因為*永遠不會匹配/.
現在這裡有一些更有用的東西。我們將使用除“echo”之外的命令進行替換。我們將檔名擴充套件與 ls 命令結合起來。
$ ls /etc/ss* /etc/ssh: ssh_config ssh_host_key ssh_host_rsa_key.pub ssh_host_dsa_key ssh_host_key.pub sshd_config ssh_host_dsa_key.pub ssh_host_rsa_key /etc/ssl: lib openssl.cnf private x509v3.cnf
注意 * 如何減少額外的鍵入。如果我們執行ls /etc/s*,我們可能會進一步減少使用者需要鍵入的量。
以下是一個 ? 字元起作用的示例
$ ls /etc/ssh/ssh_host_???_key /etc/ssh/ssh_host_dsa_key /etc/ssh/ssh_host_rsa_key
有時,使用 * 或 ? 時,找不到任何檔案。在這種情況下,Shell 不會報錯;它只是不進行替換。假設在上面的示例中的機器上,我們犯了個錯誤,鍵入了/etc/sss*,它不匹配任何內容。那麼 Shell 不會進行任何替換
$ echo /etc/sss* /etc/sss*
當鍵入多個類似的引數(特別是檔名)時,花括號很有幫助。檔名實際上並不需要存在。示例
$ echo /etc/ss{h,l,ssnakes}
/etc/ssh /etc/ssl /etc/ssssnakes
它們對於同一目錄中很長的檔案列表非常有用
$ echo /bin/{ls,mv,cp} /sbin/{halt,reboot}
/bin/ls /bin/mv /bin/cp /sbin/halt /sbin/reboot
你也可以用它們來列印字母表(或數字)
$ echo {z..a}
z y x w v u t s r q p o n m l k j i h g f e d c b a