譯者: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) 告知,謝謝
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) 告知,謝謝
全站熱搜
留言列表