跳轉到內容

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
華夏公益教科書