新聞中心

linux shell 腳本入門

作者: 時(shí)間:2007-04-24 來(lái)源:網(wǎng)絡(luò) 收藏

本文引用地址:http://butianyuan.cn/article/258223.htm

6. Here documents

當(dāng)要將幾行文字傳遞給一個(gè)命令時(shí),here documents(譯者注:目前還沒(méi)有見(jiàn)到過(guò)對(duì)該詞適合的翻譯)
一種不錯(cuò)的方法。對(duì)每個(gè)腳本寫一段幫助性的文字是很有用的,此時(shí)如果我們四有那個(gè) here documents
就不必用echo函數(shù)一行行輸出。 一個(gè) Here document 以 開(kāi)頭,后面接上一個(gè)字符串,這個(gè)字符串
還必須出現(xiàn)在here document的末尾。下面是一個(gè)例子,在該例子中,我們對(duì)多個(gè)文件進(jìn)行重命名,并且
使用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
這是一個(gè)復(fù)雜一些的例子。讓我們?cè)敿?xì)討論一下。第一個(gè)if表達(dá)式判斷輸入命令行參數(shù)是
否小于3個(gè) (特殊變量$# 表示包含參數(shù)的個(gè)數(shù)) 。如果輸入?yún)?shù)小于3個(gè),則將幫助文字傳遞
給cat命令,然后由cat命令將其打印在屏幕上。打印幫助文字后程序退出。 如果輸入?yún)?shù)等
于或大于3個(gè),我們就將第一個(gè)參數(shù)賦值給變量OLD,第二個(gè)參數(shù)賦值給變量NEW。下一步,我
們使用shift命令將第一個(gè)和第二個(gè)參數(shù)從 參數(shù)列表中刪除,這樣原來(lái)的第三個(gè)參數(shù)就成為參
數(shù)列表$*的第一個(gè)參數(shù)。然后我們開(kāi)始循環(huán),命令行參數(shù)列表被一個(gè)接一個(gè)地被賦值給變量$file。
接著我 們判斷該文件是否存在,如果存在則通過(guò)sed命令搜索和替換來(lái)產(chǎn)生新的文件名。然后
將反短斜線內(nèi)命令結(jié)果賦值給newfile。這樣我們就達(dá)到了我們的目 的:得到了舊文件名和新
文件名。然后使用mv命令進(jìn)行重命名。


4)函數(shù)
如果您寫了一些稍微復(fù)雜一些的程序,您就會(huì)發(fā)現(xiàn)在程序中可能在幾個(gè)地方使用了相同的代碼,
并且您也會(huì)發(fā)現(xiàn),如果我們使用了函數(shù),會(huì)方便很多。一個(gè)函數(shù)是這個(gè)樣子的:
functionname()
{
# inside the body $1 is the first argument given to the function
# $2 the second ...
body
}
您需要在每個(gè)程序的開(kāi)始對(duì)函數(shù)進(jìn)行聲明。

下面是一個(gè)叫做xtitlebar的腳本,使用這個(gè)腳本您可以改變終端窗口的名稱。
這里使用了一個(gè)叫做help的函數(shù)。正如您可以看到的那樣,這個(gè)定義的函數(shù)被使用了兩次。
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat
xtitlebar -- change the name of an xterm, gnome-terminal or kde konsole
USAGE: xtitlebar [-h] string_for_titelbar
OPTIONS: -h help text
EXAMPLE: xtitlebar cvs
HELP
exit 0
}
# in case of error or if -h is given we call the function help:
[ -z $1 ] help
[ $1 = -h ] help
# send the escape sequence to change the xterm titelbar:
echo -e 33]0;$107
#

在腳本中提供幫助是一種很好的編程習(xí)慣,這樣方便其他用戶(和您)使用和理解腳本。
命令行參數(shù)
我們已經(jīng)見(jiàn)過(guò)$* 和 $1, $2 ... $9 等特殊變量,這些特殊變量包含了用戶從命令
行輸入的參數(shù)。迄今為止,我們僅僅了解了一些簡(jiǎn)單的命令行語(yǔ)法(比如一些強(qiáng)制性的
參數(shù)和查看幫助的-h選項(xiàng))。 但是在編寫更復(fù)雜的程序時(shí),您可能會(huì)發(fā)現(xiàn)您需要更多的
自定義的選項(xiàng)。通常的慣例是在所有可選的參數(shù)之前加一個(gè)減號(hào),后面再加上參數(shù)值 (
比如文件名)。
有好多方法可以實(shí)現(xiàn)對(duì)輸入?yún)?shù)的分析,但是下面的使用case表達(dá)式的例子無(wú)遺是一個(gè)不錯(cuò)的方法。
#!/bin/sh
help()
{
cat
This is a generic command line parser demo.
USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2
HELP
exit 0
}
while [ -n $1 ]; do
case $1 in
-h) help;shift 1;; # function help is called
-f) opt_f=1;shift 1;; # variable opt_f is set
-l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 2
--) shift;break;; # end of options
-*) echo error: no such option $1. -h for help;exit 1;;
*) break;;
esac
done

echo opt_f is $opt_f
echo opt_l is $opt_l
echo first arg is $1
echo 2nd arg is $2
您可以這樣運(yùn)行該腳本:
cmdparser -l hello -f -- -somefile1 somefile2
返回的結(jié)果是:
opt_f is 1
opt_l is hello
first arg is -somefile1
2nd arg is somefile2


這個(gè)腳本是如何工作的呢?腳本首先在所有輸入命令行參數(shù)中進(jìn)行循環(huán),將輸入?yún)?shù)
與case表達(dá)式進(jìn)行比較,如果匹配則設(shè)置一個(gè)變量并且移除該參數(shù)。根據(jù)unix系統(tǒng)的慣例,
首先輸入的應(yīng)該是包含減號(hào)的參數(shù).



評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉