譯者:Nica



Shell 程式的撰寫高度仰賴字串處理。字串這個詞,通常指的就是一連串字元;典型字串可能是要給命令的一行輸入,或者是單一參數。使用者將回應輸入至提示符號後、產生檔名,然後命令輸出結果。環顧整個輸出,從頭到尾取決於提供的字串是否相符於給定的樣式,這樣的程序稱之為樣式比對 ( pattern matching )。shell 提供了相當多內建的樣式比對功能。



原文摘錄自最新出版的  Beginning Portable Shell Scripting



除此之外,有很多常見的 Unix 工具程式 - 像是 grep 與 sed 亦提供樣式比對的功能。這些程式一般來說是使用功能更為強大的樣式比對方式 - 稱之為正規表示式 ( regular expressions )。正規表示式雖不同於 shell 樣式,但對 shell script 撰寫效率上而言,是極為重要的。即便可攜式的正規表示式支援並未內建在 shell 裡,但有許許多多外部工具程式仍相當仰賴 shell 程式,它們有很多都是使用正規表示式。



shell 樣式



shell 的樣式用在很多地方,最常見的用法就是在 case  述句裡。下面的程式提供兩個 shell 變數 string 與 pattern ,決定 text 是否相符於 pattern:



++++++++++++++

case $string in

$pattern) echo "Match" ;;

*) echo "No match";;

esac

++++++++++++++



若 $string 相符於 $pattern,則 shell 呼叫 "Match" 並離開 case 述句。否則,它會檢查 $string 是否相符於 *。由於 * 相符於所有 shell 樣式,shell 將在沒有任何東西相符於 $pattern 時,列印 "No match" (case 述句僅執行一個分支,就算是有一個以上的樣式相符也一樣)



欲探索樣式比對,你可能會發現建立一個以此為基礎的 shell script 還蠻有用的。下面整個全功能 script,執行的是一些字與樣式的比對測試:



++++++++++++++++++

#!/bin/sh

pattern="$1"

shift

echo "Matching against '$pattern':"

for string

do

case $string in

$pattern) echo "$string: Match." ;;

*) echo "$string: No match." ;;

esac

done

+++++++++++++++++++++++++



將此 script 存成檔名為 pattern 的檔,令其為可執行模式 ( chmod a+x pattern ),接下來就能以此執行你要的測試:



+++++++++++++++++++++++++

$ ./pattern '*' 'hello'

Matching against '*':

hello: Match.

$ ./pattern 'hello*' 'hello' 'hello, there' 'well, hello'

Matching against 'hello*': hello: Match.

hello, there: Match.

well, hello: No match.

++++++++++++++++++++++++++



記得在參數兩邊使用單引號。含括在樣式裡但未加上引號的字元 - 例如星號,是為了通配 ( globbing ) ( 有時稱之為檔名延伸 ) 使用,shell 會在那個地方,置換為任一相符於樣式的名稱的檔案,這麼作將令此測試產生令人誤解的結果。



...



詳細內文/原文出處:

Patterns and string processing in shell scripts

如有版權問題,請來信 (nicaliu at gmail dot com) 告知,謝謝
arrow
arrow
    全站熱搜

    nicaliu 發表在 痞客邦 留言(0) 人氣()