新建一個(gè)文本文件包含所需要的腳本。舉例,我會(huì)使用pico編輯器寫一個(gè)腳本用來(lái)運(yùn)行程序tar,帶上必要的可選項(xiàng)可以用來(lái)解壓從因特網(wǎng)下載下來(lái)的*.tar的文件(我好像總是記不住tar的所有參賽)。我決定把我的腳本名稱叫做“untar”:
pico untar
因?yàn)樵谖业漠?dāng)前工作目錄里untar文件不存在,所有pico文本編輯器自動(dòng)創(chuàng)建這個(gè)文件,現(xiàn)在,我輸入以下內(nèi)容:
#!/bin/bash
echo this is the script file $0
echo untarring the file $1
# this calls tar with options -xvzf (extract,
# verbose, filter through gzip, input filename)
tar -xvzf $1
我使用<CTRL>O保存這個(gè)文件,然后<CTRL>X退出。
腳本的第一行,以“#!”開始是特別的提示-它告訴shell應(yīng)該用哪一個(gè)程序來(lái)解釋我的腳本。在這個(gè)例子里,我使用bash shell /bin/bash。第一行必須使用“#!”開頭,否則腳本不會(huì)運(yùn)行(系統(tǒng)認(rèn)為是一個(gè)文本文件)。其他以“#”開始的行是注釋行只是給作者和讀者使用的,計(jì)算機(jī)將跳過(guò)這些行。
在以上腳本里,參數(shù)$0, $1, $2…是傳遞到腳本里面的參數(shù)。舉個(gè)例子,如果我運(yùn)行我的腳本名“myscript”帶七個(gè)參數(shù)如下:
myscript a b c d e f g
那么,參賽$0就是myscript, $1就是a, $2就是b,$3就是c,依此類推。
腳本的第二行和第三行,echo命令輸出所有在它后面同一行上的文本,然后擴(kuò)展在腳本里對(duì)應(yīng)的參數(shù)$0和$1。第四行和第五行是我寫的注釋文本,提醒我在這個(gè)腳本里要做的事情。只有最后一行是真正起作用的。
一旦腳本已經(jīng)寫好,我把文件屬性改成對(duì)文件擁有者是“可執(zhí)行”的:
chmod u+x untar
然后我的腳本就可以這樣運(yùn)行了:
./untar my_tar.tar.gz
Liunx腳本的確非常豐富,靈活,功能強(qiáng)勁,還可能有點(diǎn)復(fù)雜。然而,對(duì)于日常任務(wù)編寫一些簡(jiǎn)單腳本,它并不需要什么特別高深的知識(shí)。你可以把一些要用到的命令放在一起,一個(gè)接一個(gè),輸入到文件里。我使用腳本很頻繁是因?yàn)槲姨珣辛耍幌胍淮我淮蔚妮斎胂嗤拿睢?/p>
一個(gè)最簡(jiǎn)單的方法,可以把一組命令放在文本文件里然后使用source命令傳遞給shell讓它直接運(yùn)行:
source my_file
這個(gè)時(shí)候就不需要在文本第一行加上“#!”的標(biāo)志了。
3.4.6? 引號(hào)的含義
?
一般來(lái)說(shuō),以下字符對(duì)于shell有特殊的含義:
\ ' " ` < > [ ] ? | ; # $ ^ & * ( ) = <Space> <Tab> <Newline>
這里有四種不同的符號(hào):反斜杠(\),單引號(hào)(‘),雙引號(hào)(“),反向單引號(hào)(`)。
?反斜杠(\)表示:關(guān)閉后面字符的特殊含義?
?單引號(hào)(‘)表示:關(guān)閉在兩個(gè)單引號(hào)之間所有字符的特殊含義?
?雙引號(hào)(“)表示:關(guān)閉在兩個(gè)雙引號(hào)之間所有字符的特殊含義除了$ ` \?
?反向單引號(hào)(`)表示:告訴shell首先運(yùn)行兩個(gè)反向單引號(hào)之間的命令,然后把得到的結(jié)果再傳遞給兩個(gè)單引號(hào)之外的命令。同樣的功能也可以通過(guò)“$command”命令來(lái)實(shí)現(xiàn),而且可能會(huì)更方便。?
舉個(gè)例子,我可以創(chuàng)建一個(gè)奇怪的目錄名叫做“*”通過(guò)使用“\”或者“’”符號(hào):
mkdir \*
mkdir ’*’
這屏蔽了“*”對(duì)于shell的特別含義。如果沒(méi)有“\”,“*”意味著當(dāng)前目錄下所有文件。
3.4.7? 輸入輸出重定向
?
有三個(gè)最重要的輸入輸出流:標(biāo)準(zhǔn)輸入(stdin),標(biāo)準(zhǔn)輸出(stdout),標(biāo)準(zhǔn)錯(cuò)誤(stderr)。它們對(duì)于控制臺(tái)(“控制臺(tái)”指的是鍵盤用于輸入,屏幕用于輸出)來(lái)說(shuō)是缺省的,但是它們可以被重定向。
重定向標(biāo)準(zhǔn)輸出,可以使用“>”符號(hào),舉例:
dir my_dir > filelisting.txt
將把dir命令的標(biāo)準(zhǔn)屏幕輸出重定向到文本文件 filelisting.txt文件里,所以屏幕上沒(méi)有任何輸出。這個(gè)文件可以用來(lái)編輯(比如使用pico文本編輯器)或者合并到其他的文件里。
重定向標(biāo)準(zhǔn)錯(cuò)誤,可以使用結(jié)構(gòu)“2>”,舉例:
dir my_dir 2> errorlisting.txt
以上命令將送標(biāo)準(zhǔn)輸出到屏幕上,如果沒(méi)有錯(cuò)誤信息,將沒(méi)有任何信息寫到errorlisting.txt文件里。如果出錯(cuò),則沒(méi)有什么東西輸出到屏幕,而文件errorlisting.txt將包含錯(cuò)誤信息。錯(cuò)誤信息有可能是這樣的:
dir: my_dir:? Permission denied
最后,我也可以把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤一起輸出到同一個(gè)文件里,
dir my_dir > file_and_error_listing.txt 2>&1
以上命令先重定向標(biāo)準(zhǔn)輸出到文本文件里,然后再重定向標(biāo)準(zhǔn)錯(cuò)誤到和標(biāo)準(zhǔn)輸出同樣的位置。它如何實(shí)現(xiàn)可能看起來(lái)有點(diǎn)古怪,但是是可行的。
在以上的例子里,如果重定向的文件已經(jīng)存在,該文件會(huì)被覆蓋。如果你要追加到該文件的末尾,可以使用“>>”符號(hào),以上的例子就變成:
dir my_dir >> filelisting.txt
dir my_dir 2>> errorlisting.txt
dir my_dir >> file_and_error_listing.txt 2 > &1
如果你對(duì)“2>”感到很迷惑,這里有一個(gè)簡(jiǎn)單的辦法可以幫你理解,標(biāo)準(zhǔn)流有標(biāo)準(zhǔn)的解析器:“0”代表標(biāo)準(zhǔn)輸入,“1”代表標(biāo)準(zhǔn)輸出,“2”代表標(biāo)準(zhǔn)錯(cuò)誤。
dir my_dir > file.txt
是以下命令的簡(jiǎn)寫方式:
dir my_dir 1 > file.txt
那么以下命令就是用來(lái)輸出標(biāo)準(zhǔn)錯(cuò)誤:
dir my_dir 2 > file.txt
還有,你還可以使用符號(hào)“|”(管道命令)把一個(gè)命令的標(biāo)準(zhǔn)輸出送到另外一個(gè)命令的標(biāo)準(zhǔn)輸入。在以下這個(gè)標(biāo)準(zhǔn)的例子里,dir命令的標(biāo)準(zhǔn)輸出通過(guò)管道輸入到命令more里(輸出滿屏的時(shí)候自動(dòng)暫停):
dir | more
你還可以使用“tee”命令把標(biāo)準(zhǔn)輸出同時(shí)寫到文件和屏幕,
dir | tee filelisting.txt
tee是“T型連接器”的模擬音,在管道中的主要的用途是分流。
這個(gè)部分這樣都用來(lái)講述標(biāo)準(zhǔn)輸出重定向,對(duì)于標(biāo)準(zhǔn)輸入重定向不像標(biāo)準(zhǔn)輸出重定向那么有用,但是它可以使用以下方式實(shí)現(xiàn):
cat < my_file
還有一種叫做“直接插入式”的標(biāo)準(zhǔn)輸出,可以通過(guò)“<<”來(lái)實(shí)現(xiàn)。不要管它了,看起來(lái)對(duì)我沒(méi)有什么實(shí)際用處。不過(guò),如果你真的想知道,這里有一個(gè)例子(這里“>”式第二個(gè)提示符)
cat << my_marker
> my_line_from_the_keyboard
> another_line_from_the_keyboard
> my_marker
除了重定向到常規(guī)文件和“過(guò)濾器”之外(如以上的例子所示),你還可以重定向到設(shè)備和其他特殊文件。看下面這些例子。
重定向到設(shè)備文件的例子。以下命令將顯示文件列表到第四個(gè)文本終端:
dir > /dev/tty4
以下是一個(gè)重定向到一個(gè)特殊的FIFO(先進(jìn)先出)文件的例子。該命令送信息”you are lucky”到叫做“l(fā)ucky”的ICQ用戶UIN 7777777 (假定你已經(jīng)用你的ICQ程序連接到ICQF服務(wù)器上了)
echo message 7777777 “you are lucky” < ~/.licq/licq_fifo
以上的例子能夠工作是因?yàn)樵谀鉲icq目錄下的文件“l(fā)icq_fifo”是一個(gè)特別的FIFO序列文件。以上這個(gè)例子,對(duì)比于在圖形用戶界面下的ICQ程序有什么特別有用的地方嗎?舉個(gè)例子,你可以寫一個(gè)短的腳本帶上多個(gè)信息給你的那些ICQ伙伴們:
#!/bin/bash
echo Messaging UIN: $1 Message: $2 Times: $3
# The next command puts puts your licq in the status "on-line, invisible".
echo 'status *online' > ~/.licq/licq_fifo
c=0
while [ $c -le $3]
do
echo message $1 $2 > ~/.licq/licq_fifo
c=`expr $c + 1`
echo $c " "
done
echo 'status offline' > ~/.licq/licq_fifo
echo "all done"
這個(gè)例子利用了licq通信模型(FIFO文件)和簡(jiǎn)單的文件重定向功能,給你一個(gè)關(guān)于如何 “自動(dòng)化”licq的主意。
3.4.8? Shell的特殊字符(metacharacters)
?
一般來(lái)說(shuō),這些字符對(duì)于shell有特別的含義:
\ ' " ` < > | ; <Space> <Tab> <Newline> ( ) [ ] ? # $ ^ & * =
以下是這些字符的含義:
\ ‘ “ 和 ‘ 主要用來(lái)注釋,前面已經(jīng)描述過(guò) (參見 3.4.6)。
< 和 > 主要用來(lái)輸入和輸出重定向
| 是管道命令,管道左邊的標(biāo)準(zhǔn)輸出是管道右邊的標(biāo)準(zhǔn)輸入
; 用于間隔在同一命令行上的幾個(gè)命令
<Space> 和 <Tab> 間用于分開命令的字符和單詞
<Newline> 完成一條命令或者一組命令
( ) 用于封裝需要使用不同的shell啟動(dòng)的命令, 比如 ( dir )
{ } 用于封裝要用當(dāng)前shell啟動(dòng)的一組命令,比如 { dir },需要空格間隔
& 使當(dāng)前命令在后臺(tái)運(yùn)行(有它自己獨(dú)立的進(jìn)程),所以下一條命令不需要等待前一條命令結(jié)束才能開始。
* 當(dāng)搜索文件時(shí),它匹配除了以“.”開頭的所有文件
?當(dāng)搜索文件時(shí),它匹配任何單個(gè)字符
[ ] 當(dāng)搜索文件時(shí),它匹配任何在[]里面的單個(gè)字符
&& 是用于連接兩個(gè)命令的“與操作”,
command1 && command2, 只有當(dāng)command1退出狀態(tài)為0時(shí)(沒(méi)有錯(cuò)誤),command2才會(huì)被執(zhí)行。比如, cat file1 && cat file2 只有當(dāng)file1正常顯示時(shí), file2才能被顯示。
||? 是用于連接兩個(gè)命令的“或操作”
command1 || command2, 只有當(dāng)command1退出狀態(tài)非0時(shí)(有錯(cuò)誤),command2才會(huì)被顯示。比如:cat file1 || cat file2 只有當(dāng)顯示file1出錯(cuò)時(shí),file2才能被顯示
= 指定值給變量
舉例,命令me=blahblah設(shè)定值“blahblah”給變量“me”,我可以輸出變量名:
echo $me
$????? 預(yù)處理擴(kuò)展變量名
變量可以使用“=”來(lái)設(shè)定值,也可以通過(guò)預(yù)先變量設(shè)定來(lái)設(shè)置
$0???? 被執(zhí)行的shell腳本的名稱
$#???? 按位置對(duì)應(yīng)的命令輸入?yún)?shù), $1第一個(gè)參賽, $2第二個(gè)參數(shù), $3第三個(gè)參數(shù)…直到$9
$*???? 擴(kuò)展所有的位置參數(shù)給命令
$@???? 擴(kuò)展所有的位置參數(shù)給命令,但是當(dāng)“$@”使用時(shí),參數(shù)個(gè)別標(biāo)注
?
posted on 2006-09-16 18:37
有貓相伴的日子 閱讀(14327)
評(píng)論(0) 編輯 收藏 所屬分類:
linux/unix應(yīng)用