版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
LinuxShell編程入門(mén)從程序員的角度來(lái)看,Shell本身是一種用C語(yǔ)言編寫(xiě)的程序,從用戶的角度來(lái)看,Shell是用戶與Linux操作系統(tǒng)溝通的橋梁。用戶既可以輸入命令執(zhí)行,又可以利用Shell腳本編程,完成更加復(fù)雜的操作。在LinuxGUI日益完善的今天,在系統(tǒng)管理等領(lǐng)域,Shell編程仍然起著不可忽視的作用。深入地了解和熟練地掌握Shell編程,是每一個(gè)Linux用戶的必修功課之一。Linux的Shell種類眾多,常見(jiàn)的有:BourneShell(/usr/bin/sh或/bin/sh)、BourneAgainShell(/bin/bash)、CShell(/usr/bin/csh)、KShell(/usr/bin/ksh)、ShellforRoot(/sbin/sh),等等。不同的Shell語(yǔ)言的語(yǔ)法有所不同,所以不能交換使用。每種Shell都有其特色之處,基本上,掌握其中任何一種就足夠了。在本文中,我們關(guān)注的重點(diǎn)是Bash,也就是BourneAgainShell,由于易用和免費(fèi),Bash在日常工作中被廣泛使用;同時(shí),Bash也是大多數(shù)Linux系統(tǒng)默認(rèn)的Shell。在一般情況下,人們并不區(qū)分BourneShell和BourneAgainShell,所以,在下面的文字中,我們可以看到#!/bin/sh,它同樣也可以改為#!/bin/bash。利用vi等文本編輯器編寫(xiě)Shell腳本的格式是固定的,如下:#!/bin/sh#commentsYourcommandsgohere首行中的符號(hào)#!告訴系統(tǒng)其后路徑所指定的程序即是解釋此腳本文件的Shell程序。如果首行沒(méi)有這句話,在執(zhí)行腳本文件的時(shí)候,將會(huì)出現(xiàn)錯(cuò)誤。后續(xù)的部分就是主程序,Shell腳本像高級(jí)語(yǔ)言一樣,也有變量賦值,也有控制語(yǔ)句。除第一行外,以#開(kāi)頭的行就是注釋行,直到此行的結(jié)束。如果一行未完成,可以在行尾加上",這個(gè)符號(hào)表明下一行與此行會(huì)合并為同一行。編輯完畢,將腳本存盤(pán)為filename.sh,文件名后綴sh表明這是一個(gè)Bash腳本文件。執(zhí)行腳本的時(shí)候,要先將腳本文件的屬性改為可執(zhí)行的:chmod+xfilename.sh執(zhí)行腳本的方法是:./filename.sh下面我們從經(jīng)典的“helloworld”入手,看一看最簡(jiǎn)單的Shell腳本的模樣。#!/bin/sh#printhelloworldintheconsolewindowa="helloworld"echo$aShellScript是一種弱類型語(yǔ)言,使用變量的時(shí)候無(wú)需首先聲明其類型。新的變量會(huì)在本地?cái)?shù)據(jù)區(qū)分配內(nèi)存進(jìn)行存儲(chǔ),這個(gè)變量歸當(dāng)前的Shell所有,任何子進(jìn)程都不能訪問(wèn)本地變量。這些變量與環(huán)境變量不同,環(huán)境變量被存儲(chǔ)在另一內(nèi)存區(qū),叫做用戶環(huán)境區(qū),這塊內(nèi)存中的變量可以被子進(jìn)程訪問(wèn)。變量賦值的方式是:variable_name=variable_value如果對(duì)一個(gè)已經(jīng)有值的變量賦值,新值將取代舊值。取值的時(shí)候要在變量名前加$,$variable_name可以在引號(hào)中使用,這一點(diǎn)和其他高級(jí)語(yǔ)言是明顯不同的。如果出現(xiàn)混淆的情況,可以使用花括號(hào)來(lái)區(qū)分,例如:echo"Hi,$as"就不會(huì)輸出“Hi,helloworlds”,而是輸出“Hi,”。這是因?yàn)镾hell把$as當(dāng)成一個(gè)變量,而$as未被賦值,其值為空。正確的方法是:echo"Hi,${a}s"單引號(hào)中的變量不會(huì)進(jìn)行變量替換操作。
關(guān)于變量,還需要知道幾個(gè)與其相關(guān)的Linux命令。env用于顯示用戶環(huán)境區(qū)中的變量及其取值;set用于顯示本地?cái)?shù)據(jù)區(qū)和用戶環(huán)境區(qū)中的變量及其取值;unset用于刪除指定變量當(dāng)前的取值,該值將被指定為NULL;export命令用于將本地?cái)?shù)據(jù)區(qū)中的變量轉(zhuǎn)移到用戶環(huán)境區(qū)。下面我們來(lái)看一個(gè)更復(fù)雜的例子,結(jié)合這個(gè)例子,我們來(lái)講述ShellScript的語(yǔ)法。
1
#!/bin/bash
2
#
we
have
less
than
3
arguments.
the
help
text:
3
if
[
$#
-lt
3
];
then
4
cat<<HELP
5
ren
--
renames
a
number
of
files
using
sed
regular
expressions
6
7
USAGE:
ren
'regexp'
'replacement'
files
8
EXAMPLE:
rename
all
*.HTM
files
in
*.html:
9
ren
'HTM$'
'html'
*.HTM
10
11
HELP
12
exit
0
13
fi
14
OLD="$1"
15
NEW="$2"
16
#
The
shift
command
removes
one
argument
from
the
list
of
17
#
command
line
arguments.
18
shift
19
shift
20
#
$*
contains
now
all
the
files:
21
for
file
in
$*;
do
22
if
[
-f
"$file"
];
then
23
newfile=`echo
"$file"
|
sed
"s/${OLD}/${NEW}/g"`
24
if
[
-f
"$newfile"
];
then
25
echo
"ERROR:
$newfile
exists
already"
26
else
27
echo
"renaming
$file
to
$newfile
"
28
mv
"$file"
"$newfile"
29
fi
30
fi
31
done
我們從頭來(lái)看,前面兩行上一個(gè)例子中已經(jīng)解釋過(guò)了,從第三行開(kāi)始,有新的內(nèi)容。if語(yǔ)句和其他編程語(yǔ)言相似,都是流程控制語(yǔ)句。它的語(yǔ)法是:if…;then…elif…;then…else…fi與其他語(yǔ)言不同,ShellScript中if語(yǔ)句的條件部分要以分號(hào)來(lái)分隔。第三行中的[]表示條件測(cè)試,常用的條件測(cè)試有下面幾種:[-f"$file"]判斷$file是否是一個(gè)文件[$a-lt3]判斷$a的值是否小于3,同樣-gt和-le分別表示大于或小于等于[-x"$file"]判斷$file是否存在且有可執(zhí)行權(quán)限,同樣-r測(cè)試文件可讀性[-n"$a"]判斷變量$a是否有值,測(cè)試空串用-z["$a"="$b"]判斷$a和$b的取值是否相等[cond1-acond2]判斷cond1和cond2是否同時(shí)成立,-o表示cond1和cond2有一成立要注意條件測(cè)試部分中的空格。在方括號(hào)的兩側(cè)都有空格,在-f、-lt、=等符號(hào)兩側(cè)同樣也有空格。如果沒(méi)有這些空格,Shell解釋腳本的時(shí)候就會(huì)出錯(cuò)。$#表示包括$0在內(nèi)的命令行參數(shù)的個(gè)數(shù)。在Shell中,腳本名稱本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整個(gè)參數(shù)列表,不包括$0,也就是說(shuō)不包括文件名的參數(shù)列表?,F(xiàn)在我們明白第三行的含義是如果腳本文件的參數(shù)少于三個(gè),則執(zhí)行if和fi語(yǔ)句之間的內(nèi)容。然后,從第四行到第十一行之間的內(nèi)容在ShellScript編程中被稱為Here文檔,Here文檔用于將多行文本傳遞給某一命令。Here文檔的格式是以<<開(kāi)始,后跟一個(gè)字符串,在Here文檔結(jié)束的時(shí)候,這個(gè)字符串同樣也要出現(xiàn),表示文檔結(jié)束。在本例中,Here文檔被輸出給cat命令,也即將文檔內(nèi)容打印在屏幕上,起到顯示幫助信息的作用。第十二行的exit是Linux的命令,表示退出當(dāng)前進(jìn)程。在Shell腳本中可以使用所有的Linux命令,利用上面的cat和exit,從一方面來(lái)說(shuō),熟練使用Linux命令也可以大大減少Shell腳本的長(zhǎng)度。十四、十五兩句是賦值語(yǔ)句,分別將第一和第二參數(shù)賦值給變量OLD和NEW。緊接下來(lái)的兩句是注釋,注釋下面的兩條shift的作用是將參數(shù)列表中的第一個(gè)和第二個(gè)參數(shù)刪除,后面的參數(shù)依次變?yōu)樾碌牡谝缓偷诙?shù),注意參數(shù)列表原本也不包括$0。然后,自二十一行到三十一行是一個(gè)循環(huán)語(yǔ)句。ShellScript中的循環(huán)有下面幾種格式:while[cond1]&&{||}[cond2]…;do…doneforvarin…;do…donefor((cond1;cond2;cond3))do…doneuntil[cond1]&&{||}[cond2]…;do…done在上面這些循環(huán)中,也可以使用類似C語(yǔ)言中的break和continue語(yǔ)句中斷當(dāng)前的循環(huán)操作。第二十一行的循環(huán)是將參數(shù)列表中的參數(shù)一個(gè)一個(gè)地放入變量file中。然后進(jìn)入循環(huán),判斷file是否為一個(gè)文件,如果是文件的話,則用sed命令搜索和生成新的文件名。sed基本上可以看成一個(gè)查找替換程序,從標(biāo)準(zhǔn)輸入,例如管道讀入文本,并將結(jié)果輸出到標(biāo)準(zhǔn)輸出,sed使用正則表達(dá)式進(jìn)行搜索。在第二十三行中,backtick(`)的作用是取出兩個(gè)backtick之間的命令輸出結(jié)果,在這里,也就是將結(jié)果取出賦給變量newfile。此后,判斷newfile是否已經(jīng)存在,否則就把file改成newfile。這樣我們就明白這個(gè)腳本的作用了,ShellScript編寫(xiě)的其他腳本與此相似,只不過(guò)是語(yǔ)法和用法稍有不同而已。通過(guò)這個(gè)例子我們明白了ShellScript的編寫(xiě)規(guī)則,但還有幾件事情需要講述一下。第一個(gè),除了if語(yǔ)句之外,ShellScript中也有類似C語(yǔ)言中多分支結(jié)構(gòu)的case語(yǔ)句,它的語(yǔ)法是:casevarinpattern1)…;;pattern2)…;;*)…;;esac我們?cè)倬拖旅嬉粋€(gè)例子,看看case語(yǔ)句的用法。whilegetoptsvc:OPTIONdocase$OPTIONinc)COPIES=$OPTARG
ehco"$COPIES";;v)echo"suyang";;\?)exit1;;esacdone上面的getopts類似于C語(yǔ)言提供的函數(shù)getopts,在ShellScript中,getopts經(jīng)常和while語(yǔ)句聯(lián)合起來(lái)使用。getopts的語(yǔ)法如下:getoptsoption_stringvariableoption_string中包含一串單字符選項(xiàng),若getopts在命令行參數(shù)中發(fā)現(xiàn)了連字符,那么它會(huì)將連字符之后的字符與option_string進(jìn)行比較,若匹配成功,則把變量variable的值設(shè)為該選項(xiàng),若無(wú)匹配,則把變量的值設(shè)為?。有時(shí)候,選項(xiàng)還會(huì)帶一個(gè)值,例如-c5等,這時(shí)要在option_string中該選項(xiàng)字母后面加上一個(gè)冒號(hào),getopts發(fā)現(xiàn)冒號(hào)后,會(huì)讀取該值,然后將該值放入特殊變量OPTARG中。這個(gè)命令比較復(fù)雜,如有需要,讀者可以詳細(xì)參閱Shell編寫(xiě)的相關(guān)資料。上面這個(gè)循環(huán)的作用就是依次取出腳本名稱后面的選項(xiàng),進(jìn)行處理,如果輸入了非法選項(xiàng),則進(jìn)入"?指定的部分,退出腳本程序。第二個(gè),Bash提供了一種用于交互式應(yīng)用的擴(kuò)展select,用戶可以從一組不同的值中進(jìn)行選擇。其語(yǔ)法如下:selectvarin…;dobreak;done例如,下面這段程序的輸出是:#!/bin/bashecho"Yourchoice?"selectvarin"a""b""c";dobreakdoneecho$var----------------------------Yourchoice?1)a2)b3)c第三,ShellScript中也可以使用自定義的函數(shù),其語(yǔ)法形式如下:functionname(){…}例如我們可以把上面第二個(gè)例子中第四到第十二行放入一個(gè)名為help函數(shù)體內(nèi),以后每次調(diào)用的時(shí)候直接寫(xiě)help即可。函數(shù)中處理函數(shù)調(diào)用參數(shù)的方法是,直接用上面講過(guò)的$1、$2來(lái)分別表示第一、第二個(gè)參數(shù),用$*表示參數(shù)列表。第四,我們也可以在Shell下調(diào)試ShellScript腳本,當(dāng)然最簡(jiǎn)單的方法就是用echo輸出查看變量取值了。Bash也提供了真正的調(diào)試方法,就是執(zhí)行腳本的時(shí)候用-x參數(shù)。sh-xfilename.sh這會(huì)執(zhí)行腳本并顯示腳
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 讀者畫(huà)像在出版業(yè)的價(jià)值-洞察及研究
- 未來(lái)五年天然板巖蘑菇石市場(chǎng)需求變化趨勢(shì)與商業(yè)創(chuàng)新機(jī)遇分析研究報(bào)告
- 未來(lái)五年木制工具企業(yè)ESG實(shí)踐與創(chuàng)新戰(zhàn)略分析研究報(bào)告
- 未來(lái)五年塑料吹瓶機(jī)企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級(jí)戰(zhàn)略分析研究報(bào)告
- 未來(lái)五年健康促進(jìn)與社會(huì)參與企業(yè)縣域市場(chǎng)拓展與下沉戰(zhàn)略分析研究報(bào)告
- 未來(lái)五年防偽企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級(jí)戰(zhàn)略分析研究報(bào)告
- 未來(lái)五年魷魚(yú)企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級(jí)戰(zhàn)略分析研究報(bào)告
- 2025山西空港新城太平中學(xué)就業(yè)見(jiàn)習(xí)招聘2人備考題庫(kù)及答案詳解(易錯(cuò)題)
- 2026安徽池州市東至縣機(jī)關(guān)事務(wù)服務(wù)中心招聘司勤人員3人備考題庫(kù)有完整答案詳解
- 2026安徽合肥國(guó)家實(shí)驗(yàn)室技術(shù)支撐崗位招聘2人備考題庫(kù)及一套參考答案詳解
- 大數(shù)據(jù)安全技術(shù)與管理
- 2026年中小學(xué)校長(zhǎng)校園安全管理培訓(xùn)考試題及答案
- 2025年山東建筑大學(xué)思想道德修養(yǎng)與法律基礎(chǔ)期末考試模擬題必考題
- 江西省贛州地區(qū)2023-2024學(xué)年七年級(jí)上學(xué)期期末英語(yǔ)試(含答案)
- 2025年香港滬江維多利亞筆試及答案
- 述職報(bào)告中醫(yī)
- 患者身份識(shí)別管理標(biāo)準(zhǔn)
- 松下Feeder維護(hù)保養(yǎng)教材
- 汽車融資貸款合同范本
- 水環(huán)境保護(hù)課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論