第09章 linux學(xué)習(xí)shell script_第1頁(yè)
第09章 linux學(xué)習(xí)shell script_第2頁(yè)
第09章 linux學(xué)習(xí)shell script_第3頁(yè)
第09章 linux學(xué)習(xí)shell script_第4頁(yè)
第09章 linux學(xué)習(xí)shell script_第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 Shell Script 有點(diǎn)像是早期的批處理文件, 即是將一些指令匯整起來(lái)一次執(zhí)行,但是 Shell Script 擁有更強(qiáng)大的功能,那就是, 它可以進(jìn)行類(lèi)似程序 (program) 的編寫(xiě),并且,不需要經(jīng)過(guò)編譯 (compiler) 就能夠執(zhí)行, 真的很方便。 我們可透過(guò) Shell Script來(lái)簡(jiǎn)化我們?nèi)粘5墓ぷ鞴芾恚?而且,整個(gè) Linux 環(huán)境中,一些服務(wù) (services) 的啟動(dòng)都是透過(guò) Shell Script的, 如果對(duì)于 Shell Script 不了解,發(fā)生問(wèn)題時(shí),可真是會(huì)求助無(wú)門(mén)。第九章 shell script編程1 什么是shell script 什么是she

2、ll script(程序化腳本)?就字面上的意義,我們將它分為2部分: shell:命令行界面下讓用戶(hù)與系統(tǒng)溝通的一個(gè)工具接口; script:腳本的意思; 即, shell script 是針對(duì)shell所寫(xiě)的“腳本”。 shell script是利用shell的功能所寫(xiě)的一個(gè)“程序”,這個(gè)程序是使用純文本文件,將一些shell的語(yǔ)法與命令寫(xiě)在里面,搭配正則表達(dá)式、管道命令與數(shù)據(jù)流重定向等功能,以達(dá)到我們所想要的處理目的。1.1 為什么要學(xué)些shell script 如果你是真的想要玩清楚 Linux 的來(lái)龍去脈, 那么 shell script 就不可不知,因?yàn)椋簎自動(dòng)化管理的重要依據(jù)u追

3、蹤與管理系統(tǒng)的重要工作u簡(jiǎn)單入侵檢測(cè)功能u連續(xù)命令單一化u簡(jiǎn)單數(shù)據(jù)處理u跨平臺(tái)支持與學(xué)習(xí)歷程較短1.2 第一個(gè)shell script的編寫(xiě)與執(zhí)行 shell script 其實(shí)就是純文字文件 (ASCII) ,我們可以編輯這個(gè)文件, 然后讓這個(gè)文件來(lái)幫我們一次執(zhí)行多個(gè)指令,或者是利用一些運(yùn)算與邏輯判斷來(lái)幫我們達(dá)成某些功能。 所以,要編輯這個(gè)文件的內(nèi)容時(shí),當(dāng)然就需要具備有 bash shell 指令下達(dá)的相關(guān)認(rèn)識(shí)。1. 命令的執(zhí)行是從上而下、從左而右地分析與執(zhí)行2. 命令與參數(shù)間的多個(gè)空白會(huì)被忽略掉;3. 空白行也將被忽略掉,并且 tab 按鍵所得得空白同樣視為空格鍵;4. 如果讀取到一個(gè) E

4、nter 符號(hào) ( CR ),就嘗試開(kāi)始執(zhí)行該行(或該串)命令;5. 至于如果一行的內(nèi)容太多,則可以使用 Enter 來(lái)延伸至下一行;6. 此外,使用最多的 # 可做為批注!任何加在 # 后面的數(shù)據(jù),將全部被視為批注文字而被忽略!u 直接命令執(zhí)行:shell.sh文件必須要具備可讀與可執(zhí)行(rx)的權(quán)限,然后:l 絕對(duì)路徑:使用 /home/ubuntu/shell.sh 來(lái)執(zhí)行命令;l 相對(duì)路徑:假設(shè)工作目錄在 /home/ubuntu/,則使用 ./shell.sh 來(lái)執(zhí)行l(wèi) 變量“PATH”功能:通過(guò)“bash shell.sh”或者”sh shell.sh”來(lái)執(zhí)行u編寫(xiě)第一個(gè)scrip

5、t(sh01.sh)聲明這個(gè)script使用的shell名稱(chēng)批注:程序功能、版本、作者等主環(huán)境變量的聲明主要程序部分告知執(zhí)行結(jié)果1.3 編寫(xiě)shell script的良好習(xí)慣 一個(gè)良好習(xí)慣的養(yǎng)成是很重要的。大家在剛開(kāi)始撰寫(xiě)程序的時(shí)候,最容易忽略這部分, 認(rèn)為程序?qū)懗鰜?lái)就好了,其它的不重要。其實(shí),如果程序的說(shuō)明能夠更清楚, 那么對(duì)你自己是有很大的幫助的。 同時(shí),在一些環(huán)境的設(shè)定上面,畢竟每個(gè)人的環(huán)境都不相同,為了取得較佳的執(zhí)行環(huán)境, 最好自行先定義好一些一定會(huì)被用到的環(huán)境變量,例如 PATH 。這樣比較好。所以說(shuō),建議你一定要養(yǎng)成良好的 script 編寫(xiě)習(xí)慣, 在每個(gè) script 的文件頭處

6、記錄好:p script 的功能;p script 的版本信息;p script 的作者與聯(lián)絡(luò)方式;p script 的版權(quán)聲明方式;p script 的 History (歷史紀(jì)錄);p script 內(nèi)較特殊的指令,使用絕對(duì)路徑的方式來(lái)執(zhí)行;p script 執(zhí)行時(shí)需要的環(huán)境變量預(yù)先聲明與設(shè)置。2 簡(jiǎn)單的shell script 練習(xí)2.1 簡(jiǎn)單范例u 交互式腳本:變量?jī)?nèi)容由用戶(hù)決定 很多時(shí)候我們需要使用者輸入一些內(nèi)容,好讓程序可以順利運(yùn)作。 練習(xí)(sh02.sh) :編寫(xiě)一個(gè)script,它可以讓用戶(hù)輸入first name與last name,最后在屏幕上顯示“Your full na

7、me is:”的內(nèi)容。u隨日期變化:利用日期進(jìn)行文件的創(chuàng)建 假設(shè)我的服務(wù)器內(nèi)有數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)每天的數(shù)據(jù)都不太一樣,一次當(dāng)我備份時(shí),希望將每天的數(shù)據(jù)都備份成不同的文件名,這樣才能夠讓舊的數(shù)據(jù)也能夠保存下來(lái)不被覆蓋。 練習(xí)(sh03.sh) :假設(shè)用戶(hù)想要?jiǎng)?chuàng)建3個(gè)空白文件,文件名最開(kāi)頭由用戶(hù)輸入決定,假設(shè)用戶(hù)輸入filename,今天的日期是2015/12/03,我想要以前天、昨天、今天的日期來(lái)創(chuàng)建這些文件,即filename_20151201, filename_20151202, filename_20151203,如何實(shí)現(xiàn)?u數(shù)值運(yùn)算:簡(jiǎn)單的加減乘除 我們可以使用 declare 來(lái)定義變量

8、的類(lèi)型吧?當(dāng)變量被定義成整數(shù)后才能夠進(jìn)行加減運(yùn)算。此外,我們也可以利用$((計(jì)算式))來(lái)進(jìn)行數(shù)值運(yùn)算的??上У氖牵琤ash shell默認(rèn)僅支持到整數(shù)的數(shù)據(jù)而已。如果我們要用戶(hù)輸入兩個(gè)變量,然后將兩個(gè)變量的內(nèi)容相乘, 最后輸出相乘的結(jié)果,那可以怎么做? 練習(xí)(sh04.sh) :要求用戶(hù)輸入兩個(gè)變量,然后將兩個(gè)變量的內(nèi)容進(jìn)行算術(shù)運(yùn)算, 最后輸出運(yùn)算的結(jié)果。3 善用判斷式 在 bash 章節(jié)中,我們提到過(guò) $? 這個(gè)變量所代表的意義, 此外,也通過(guò) & 及 | 來(lái)作為前一個(gè)命令是否能夠成功進(jìn)行的一個(gè)依據(jù)。 那么,如果我想要知道 /ubuntu 這個(gè)目錄是否存在時(shí),難道一定要使用 ls 搭

9、配數(shù)據(jù)流重定向,最后配合$?來(lái)決定后續(xù)的命令進(jìn)行與否。但是否有更簡(jiǎn)單的方式可以來(lái)進(jìn)行“條件判斷”?3.1 利用 test 指令的測(cè)試功能 當(dāng)我要檢測(cè)系統(tǒng)上面某些文件或者是相關(guān)的屬性時(shí),利用 test 這個(gè)命令來(lái)工作, 真是好用得不得了。舉例來(lái)說(shuō),我要檢查 /ubuntu 是否存在時(shí),使用:#test e /ubuntu 要顯示結(jié)果,利用$?或&或|改寫(xiě)上面的例子#test -e /ubuntu & echo “exist | echo “Not exist -e是測(cè)試一個(gè)“東西”在不在,如果還要測(cè)試該文件名是什么,還有哪些標(biāo)志可以來(lái)判斷?測(cè)試的標(biāo)志代表意義關(guān)于某個(gè)文件名的“文件

10、類(lèi)型”判斷-e該文件名是否存在(常用)-f該文件名是否存在且為文件(常用)-d該文件名是否存在且為目錄(常用)-b該文件問(wèn)是否存在且為block device設(shè)備-c該文件問(wèn)是否存在且為character device設(shè)備-S該文件問(wèn)是否存在且為Socket文件-p該文件問(wèn)是否存在且為FIFO文件-L該文件問(wèn)是否存在且為連接文件測(cè)試的標(biāo)志代表意義關(guān)于文件權(quán)限檢測(cè)-r檢測(cè)該文件名是否存在且具有“可讀”的權(quán)限-w檢測(cè)該文件名是否存在且具有“可寫(xiě)”的權(quán)限-x檢測(cè)該文件名是否存在且具有“可執(zhí)行”的權(quán)限-u檢測(cè)該文件名是否存在且具有“SUID”的權(quán)限-g檢測(cè)該文件名是否存在且具有“SGID”的權(quán)限-k檢

11、測(cè)該文件名是否存在且具有“SBIT”的權(quán)限-s檢測(cè)該文件名是否存在且為“非空白文件”測(cè)試的標(biāo)志代表意義2個(gè)文件之間的比較-nt(newer than)判斷file1是都比f(wàn)ile2新-ot(older than)判斷file1是都比f(wàn)ile2舊-ef判斷file1與file2是否為同一個(gè)文件,可以用在判斷hard link的判定上。測(cè)試的標(biāo)志代表意義關(guān)于2個(gè)整數(shù)之間的判定-eq兩數(shù)值相等(equal)-ne兩數(shù)值不相等(not equal)-gtn1大于n2(greater than)-ltn1小于n2(less than)-gen1大于等于n2(greater than or equal)-

12、len1小于n2(less than or equal)測(cè)試的標(biāo)志代表意義判定字符串的數(shù)據(jù)Test z string判定字符串是否為0,若srting為空字符串,則為trueTest n string判定字符串是否非為0,若srting為空字符串,則為falsetest str1 =str2判定str1 是否等于str2,若相等,回傳truetest str1 !=str2判定str1 是否不等于str2,若相等,回傳false多重條件判定,例如:test r filename a x filename-e2個(gè)條件同時(shí)成立,回傳true-o任何一個(gè)條件成立,回傳true!反向狀態(tài),回傳true

13、3.2 利用判斷符號(hào) 除了我們使用的 test 之外,其實(shí),我們還可以利用判斷符號(hào) 來(lái)進(jìn)行數(shù)據(jù)的判斷。 舉例來(lái)說(shuō),如果我想要知道 $HOME 這個(gè)變量是否為空的,可以這樣做:# -z “$HOME” ; echo $?# $HOME = $MAIL -su: /root: No such file or directory 在中括號(hào) 內(nèi)的每個(gè)組件都要有空格鍵來(lái)分隔 在中括號(hào)內(nèi)的變量,最好都以雙引號(hào)括號(hào)起來(lái) 在中括號(hào)內(nèi)的常量,最好都以單或雙引號(hào)括號(hào)起來(lái)舉例說(shuō)明 中的格式要求:假設(shè)用戶(hù)設(shè)置了name=“ubuntu test”,然后這樣判定:# name=“ubuntu tset”# $name

14、= “ubuntu”bash: : too many arguments # “$name” = “ubuntu” 中括號(hào)的使用方法與標(biāo)志與 test 幾乎一模一樣。 只是中括號(hào)比較常用在條件判斷式 if . then . fi 的情況中。 下面,使用中括號(hào)的判定來(lái)做一個(gè)小案例,案例(sh05.sh)如下: 當(dāng)執(zhí)行一個(gè)程序的時(shí)候,這個(gè)程序會(huì)讓使用者選擇 Y 或 N , 如果使用者輸入 Y 或 y 時(shí),就顯示 OK, continue 如果使用者輸入 N或 n 時(shí),就顯示 Oh, interrupt ! 如果不是 Y/y/N/n 之內(nèi)的其它字符,就顯示 I dont know what is y

15、our choise4 條件判斷式 只要講到“程序”的話(huà),那么條件判斷式,即是“ if then ”這種判別式肯定一定要學(xué)習(xí)的。 因?yàn)楹芏鄷r(shí)候,我們都必須要依據(jù)某些數(shù)據(jù)來(lái)判斷程序該如何進(jìn)行。 簡(jiǎn)單的方式可以利用 & 與 | ,但如果我還想要執(zhí)行一堆指令呢? 那真的得要 if then 來(lái)幫忙。4.1 利用 ifthenu 單層、簡(jiǎn)單條件判斷式if 條件判斷式 ; then #當(dāng)條件判斷式成立時(shí),可以進(jìn)行的命令工作內(nèi)容;fi #結(jié)束ifn &代表ANDn |代表or 所以,在使用中括號(hào)的判斷式中, & 及 | 就與命令執(zhí)行的狀態(tài)不同了。 sh05.sh 那個(gè)例子我可以改寫(xiě)

16、成這樣:原表達(dá)式: “$yn”= “Y” o “$yn”= “y” 新表達(dá)式: “$yn”= “Y” | “$yn”= “y” if $yn = Y | $yn = y ; thenecho OK, continueexit 0fiif $yn = N | $yn = n ; thenecho Oh, interrupt!exit 0fiecho I dont know what is your choise & exit 0u 多重、復(fù)雜條件判斷式 在同一個(gè)數(shù)據(jù)的判斷中,如果該數(shù)據(jù)需要進(jìn)行多種不同的判斷時(shí),應(yīng)該如何實(shí)現(xiàn)?if 條件判斷式 ; then #當(dāng)條件判斷式成立時(shí),可以進(jìn)行的

17、命令工作內(nèi)容;else #當(dāng)條件判斷式不成立時(shí),可以進(jìn)行的命令工作內(nèi)容;fiif 條件判斷式一 ; then # 當(dāng)條件判斷式一成立時(shí),可以進(jìn)行的命令工作內(nèi)容; elif 條件判斷式二 ; then #當(dāng)條件判斷式二成立時(shí),可以進(jìn)行的命令工作內(nèi)容; else #當(dāng)條件判斷式一與二均不成立時(shí),可以進(jìn)行的命令工作內(nèi)容; fi 繼續(xù)改寫(xiě)sh05.sh程序,使用多重if來(lái)實(shí)現(xiàn)(sh06.sh):if $yn = Y | $yn = y ; thenecho OK, continueelif $yn = N | $yn = n ; thenecho Oh, interrupt!elseecho I do

18、nt know what is your choisefi4.2 利用 caseesac判斷 case $變量名稱(chēng) in #關(guān)鍵字為case,變量前有$ “第一個(gè)變量?jī)?nèi)容”) #每個(gè)變量?jī)?nèi)容建議用雙引號(hào)括起來(lái),關(guān)鍵字則為 小括號(hào) 程序段 ; #每個(gè)類(lèi)型結(jié)尾使用2個(gè)連續(xù)的分號(hào)來(lái)處理 第二個(gè)變量?jī)?nèi)容) 程序段 ; *) #最后一個(gè)變量?jī)?nèi)容都會(huì)用*來(lái)代表所有其他值 不包含第一個(gè)變量?jī)?nèi)容與第二個(gè)變量?jī)?nèi)容的其它程序執(zhí)行段 exit 1 ; esac案例(sh07.sh):編寫(xiě)一個(gè)程序,讓用戶(hù)能夠輸入A,B,C,并將用戶(hù)的變量顯示在屏幕上;如果不是A,B,C,提示用戶(hù)僅有這3中選擇。4.3 利用 func

19、tion功能 什么是“函數(shù) (function)”功能?簡(jiǎn)單的說(shuō),其實(shí), 函數(shù)可以在 shell script 當(dāng)中做出一個(gè)類(lèi)似自定義執(zhí)行命令的東西,最大的功能是, 可以簡(jiǎn)化我們很多的程序代碼。 注意:shell script的執(zhí)行方式是由上而下,由左而右,因此當(dāng)中的funtion的設(shè)置一定要在程序的最前面,這樣才能夠在執(zhí)行時(shí)被找到可用的程序段。案例(sh08.sh):將sh07.sh中的“You choice is ”作為函數(shù)來(lái)實(shí)現(xiàn)。4 循環(huán)(loop) 除了 if.then.fi 這種條件判斷式之外,循環(huán)可能是程序當(dāng)中最重要的一環(huán)了。 循環(huán)可以不斷的執(zhí)行某個(gè)程序段落,直到用戶(hù)設(shè)定的條件達(dá)成

20、為止。 所以,重點(diǎn)是那個(gè)“條件的完成”是什么。4.1 while do done, until do done(不定循環(huán)) 一般來(lái)說(shuō),不定循環(huán)最常見(jiàn)的就是下面這2種狀態(tài):until condition do 程序段落donewhile condition #中括號(hào)內(nèi)的狀態(tài)就是判斷式do #循環(huán)開(kāi)始 程序段落done #循環(huán)結(jié)束案例(sh09.sh):假設(shè)我要讓用戶(hù)輸入 yes 或者是 YES 才結(jié)束程序的執(zhí)行,否則就一直進(jìn)行告知用戶(hù)繼續(xù)輸入字符串。4.2 for.do.done 相對(duì)于 while, until 的循環(huán)方式是必須要“符合某個(gè)條件”的狀態(tài), for 這種語(yǔ)法,則是“ 已經(jīng)知道要進(jìn)行幾次循環(huán)”的狀

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論