Linux shell指令碼基礎已經被分成好幾個部分了,這裡對控制流程程的內容也就馬上講完了,這是最後一部分關於here document,這裡舉例稍微有點複雜,我們慢慢來分析這個複雜Linux shell指令碼。
6. Here documents
當要將幾行文字傳遞給一個命令時,here documents(譯者註:目前還沒有見到過對該詞適合的翻譯)一種不錯的方法。對每個指令碼寫一段協助性的文字是很有用的,此時如果我們四有那個 here documents就不必用echo函數一行行輸出。 一個 "Here document" 以 << 開頭,後面接上一個字串,這個字串還必須出現在here document的末尾。下面是一個例子,在該例子中,我們對多個檔案進行重新命名,並且使用here documents列印協助:
#!/bin/sh
# we have less than 3 arguments. Print the help text:
if [ $# -lt 3 ] ; then
cat <
ren -- renames a number of files using sed regular expressions
USAGE: ren 'regexp' 'replacement' files...
EXAMPLE: rename all *.HTM files in *.html:
ren 'HTM$' 'html' *.HTM
HELP
exit 0
fi
OLD="$1"
NEW="$2"
# The shift command removes one argument from the list of
# command line arguments.
shift
shift
# $* contains now all the files:
for file in $*; do
if [ -f "$file" ] ; then
newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
if [ -f "$newfile" ]; then
echo "ERROR: $newfile exists already"
else
echo "renaming $file to $newfile ..."
mv "$file" "$newfile"
fi
fi
done
這是一個複雜一些的例子。讓我們詳細討論一下。第一個if運算式判斷輸入命令列參數是否小於3個 (特殊變數$# 表示包含參數的個數) 。如果輸入參數小於3個,則將協助文字傳遞給cat命令,然後由cat命令將其列印在螢幕上。列印協助文字後程式退出。如果輸入參數等於或大於3個,我們 就將第一個參數賦值給變數OLD,第二個參數賦值給變數NEW。下一步,我們使用shift命令將第一個和第二個參數從參數列表中刪除,這樣原來的第三個 參數就成為參數列表$*的第一個參數。然後我們開始迴圈,命令列參數列表被一個接一個地被賦值給變數$file。接著我們判斷該檔案是否存在,如果存在則 通過sed命令搜尋和替換來產生新的檔案名稱。然後將反短斜線內命令結果賦值給newfile。這樣我們就達到了我們的目的:得到了舊檔案名稱和新檔案名稱。然 後使用mv命令進行重新命名。這樣就明了這個複雜的Linux shell指令碼了吧。