1. 程式人生 > >Linux shell 基礎(五),自己慢慢一步步學

Linux shell 基礎(五),自己慢慢一步步學

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指令碼了吧。