Shell操作與簡易編程(四)

Shell特殊字符

通配符

  通配符用於模式匹配,如文件名匹配、路徑名搜索、字串查找等。常用的通配符有(*),(?)和括在方括號[ ]中的字符序列。用戶可以在作爲命令參數的文件名中包含這些通配符,構成一個所謂的“模式串”,以在執行過程中進行模式匹配。

* 代表任何字串(長度可以不等),例如:f*匹配以f打頭的任意字串。但應注意,文件名前的圓點(.)和路徑名中的斜線(/)必須顯式匹配。例如“*”不能匹配.file,而“.*”纔可以匹配.file。

  ? 代表任何單個字符。

  [ ] 代表指定的一個字符範圍,只要文件名中[ ]位置處的字符在[ ]中指定的範圍之內,那麼這個文件名就與這個模式串匹配。方括號中的字符範圍可以由直接給出的字符組成,也可以由表示限定範圍的起始字符、終止字符及中間的連字符(-)組成。例如,f [a- d] 與f [abcd]的作用相同。Shell將把與命令行中指定的模式串相匹配的所有文件名都作爲命令的參數,形成最終的命令,然後再執行這個命令。

  表3-1說明這些通配符的具體含義。

  表3-1 通配符的含義

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

   

*

當前目錄下所有文檔的名稱

*Text*

當前目錄下所有文件名中包含有Text的文件的名稱

[ab-dm]*

當前目錄下所有以a, b, c, d, m開頭的文件的名稱

[ab-dm]?

當前目錄下所有以a, b, c, d, m開頭且後面只跟有一個字符的文件的名稱

/usr/bin/??

目錄/usr/bin下所有名稱爲兩個字符的文件的名稱

  特別需要注意的是,連字符(-)僅在方括號內有效,表示字符範圍,如在方括號外面就成爲普通字符了。而“*”和“?”只在方括號外面是通配符,若出現在方括號之內,它們也失去通配符的能力,成爲普通字符了。例如,模式- a[*?]abc中只有一對方括弧是通配符,“*”和“?”均爲普通字符,因此,它匹配的字串只能是- a*abc和- a?abc。

  最後說明一下使用通配符時需要注意的一些問題。由於“*”,“?”和[ ]對於Shell來說具有比較特殊的意義,因此在正常的文件名中不應出現這些字符。特別是在目錄名中不要出現它們,否則Shell匹配起來可能會無窮遞歸下去。另外要注意的一點是:如果目錄中沒有與指定的模式串相匹配的文件名,那麼Shell將使用此模式串本身作爲參數傳給有關命令。這可能就是命令中出現特殊字符的原因所在。

  引號

  在Shell中引號分爲3種:單引號,雙引號和反引號。

  1.單引號

  由單引號括起來的字符都作爲普通字符出現。特殊字符用單引號括起來以後,也會失去原有意義,而只作爲普通字符解釋。例如:

  # string='$PATH'

  # echo $string

  #PATH

  可見,$保持了其本身的含義,作爲普通字符出現。

  2.雙引號

  由雙引號括起來的字符,除$, /, '和"這幾個字符仍是特殊字符並保留其特殊功能外,其餘字符仍作爲普通字符對待。對於$來說,就是用其後指定的變量值來代替這個變量和$;對於 / 而言,是轉義字符,它告訴Shell不要對其後面的那個字符進行特殊處理,只當做普通字符即可。可以想見,在雙引號中需要在前面加上 / 的只有4個字符$, /, '和"本身。而對 " 號,若其前面沒有加 / ,則Shell會將它同前一個 " 號匹配。

  例如,我們假定PATH的值爲.:/usr/bin:/bin,輸入如下命令:

  # String="$PATH///"/$PATH"

  # echo $TestString

  .:/usr/bin:/ bin/"$PATH

  讀者可以自己試一下在第二個雙引號之前不加 / 會產生什麼結果。

  3.反引號

  反引號(`)字符所對應的鍵一般位於鍵盤的左上角,不要將其同單引號(')混淆。反引號括起來的字串被Shell解釋爲命令行,在執行時,Shell首先執行該命令行,並以它的標準輸出結果取代整個反引號(包括兩個反引號)部分。例如:

  # pwd

  /home/xyz

  # string="current directory is `pwd`"

  # echo $string

  current directour is /home/xyz

  Shell執行echo命令時,首先執行`pwd`中的命令pwd,並將輸出結果/home/xyz取代`pwd`部分,最後輸出替換後的整個結果。

  利用反引號的這種功能可以進行命令置換,即把反引號括起來的執行結果賦值給指定變量。例如:

  # today=`date`

  # echo Today is $today

  Today is Mon Apr 15 16:20:13 CST 1999

  反引號還可以嵌套使用。但需注意,嵌套使用時內層的反引號必須用反斜線(/)將其轉義。例如:

  # abc=`echo The number of users is /`who| wc-l/``

  # echo $abc

  The number of users is 5

  註釋符

  在Shell編程或Linux的配置文檔中,經常要對某些正文行進行註釋,以增加程序的可讀性。在Shell中以字符 # 開頭的正文行表示註釋行。

發佈了44 篇原創文章 · 獲贊 2 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章