版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章shell編程-shellscript
項(xiàng)目導(dǎo)入:如果想要管理好屬于你的主機(jī),那么一定要好好學(xué)習(xí)shellscript。shellscript有點(diǎn)像是早期的批處理,即將一些命令匯總起來(lái)一次運(yùn)行。但是Shellscript擁有更強(qiáng)大的功能,那就是它可以進(jìn)行類似程序(program)的撰寫,并且不需要經(jīng)過(guò)編譯(compile)就能夠運(yùn)行,非常方便。同時(shí),我們還可以通過(guò)shellscript來(lái)簡(jiǎn)化我們?nèi)粘5墓ぷ鞴芾?。在整個(gè)Linux的環(huán)境中,一些服務(wù)(service)的啟動(dòng)都是通過(guò)shellscript來(lái)運(yùn)行的,如果你對(duì)于script不了解,一旦發(fā)生問(wèn)題,可真是會(huì)求助無(wú)門??!
職業(yè)能力目標(biāo)和要求:
理解shellscript。
掌握判斷式的用法。
掌握條件判斷式的用法。
掌握循環(huán)的用法。第4章shell編程-shellscript
1.
了解shellscript
2.練習(xí)簡(jiǎn)單的shellscript
3.用好判斷式
4.使用條件判斷式
7.項(xiàng)目實(shí)錄
5.使用循環(huán)(loop)
6.對(duì)shellscript進(jìn)行追蹤與調(diào)試4.1了解shellscript
1.了解shellscript
2.編寫與執(zhí)行一個(gè)shellscript
3.養(yǎng)成撰寫shellscript的良好習(xí)慣4.1.1了解shellscript簡(jiǎn)單地說(shuō),shellscript就像是早期DOS年代的批處理(.bat),最簡(jiǎn)單的功能就是將許多命令寫在一起,讓使用者很輕易地就能夠一下子處理復(fù)雜的操作(運(yùn)行一個(gè)文件“shellscript”,就能夠一次運(yùn)行多個(gè)命令)。而且shellscript更提供數(shù)組、循環(huán)、條件與邏輯判斷等重要功能,讓用戶也可以直接以shell來(lái)撰寫程序,而不必使用類似C程序語(yǔ)言等傳統(tǒng)程序撰寫的語(yǔ)法。4.1.2編寫與執(zhí)行一個(gè)shellscript4.1.2編寫與執(zhí)行一個(gè)shellscript4.1.2編寫與執(zhí)行一個(gè)shellscript4.1.2編寫與執(zhí)行一個(gè)shellscript4.1.3養(yǎng)成撰寫shellscript的良好習(xí)慣建議一定要養(yǎng)成良好的script撰寫習(xí)慣,在每個(gè)script的文件頭處包含如下內(nèi)容:
script的功能;
script的版本信息;
script的作者與聯(lián)絡(luò)方式;
script的版權(quán)聲明方式;
script的History(歷史記錄);
script內(nèi)較特殊的命令,使用“絕對(duì)路徑”的方式來(lái)執(zhí)行;
script運(yùn)行時(shí)需要的環(huán)境變量預(yù)先聲明與設(shè)置。4.2練習(xí)簡(jiǎn)單的shellscript
1.完成簡(jiǎn)單范例
2.了解腳本的運(yùn)行方式的差異4.2.1完成簡(jiǎn)單范例4.2.1完成簡(jiǎn)單范例4.2.1完成簡(jiǎn)單范例4.2.1完成簡(jiǎn)單范例1.利用絕對(duì)路徑、相對(duì)路徑、文件名、bash、sh等方式直接運(yùn)行腳本4.2.2了解腳本的運(yùn)行方式的差異2.利用source和.運(yùn)行腳本時(shí):在父程序中運(yùn)行4.3用好判斷式子任務(wù)1利用test命令的測(cè)試功能[root@wwwscripts]#vimsh05.sh#!/bin/sh#2019/12/8 申海杰echo"本程序會(huì)輸出你提供的文件名對(duì)應(yīng)文件的的類型及權(quán)限。"read-p"請(qǐng)輸入一個(gè)文件名:"filenametest-z$filename&&echo"你必須輸入一個(gè)文件名。"&&exit0test!-e$filename&&echo"文件不存在。"&&exit0test-f$filename&&filetype="普通文件"test-d$filename&&filetype="目錄文件"test-r$filename&&perm="可讀"test-w$filename&&perm="$perm可寫"test-x$filename&&perm="$perm可執(zhí)行"echo"文件$filename是一個(gè)$filetype。"echo"當(dāng)前用戶對(duì)此文件的權(quán)限是:$perm。"4.3用好判斷式子任務(wù)2利用判斷符號(hào)[]分析:需要利用中括號(hào)、&&與||。[root@wwwscripts]#vish06.sh#!/bin/sh#2019/12/8 申海杰read-p"請(qǐng)回答(y/n):"answer["$answer"=="y"-o"$answer"=="Y"]&&echo"是"&&exit0["$answer"=="n"-o"$answer"=="N"]&&echo"否"&&exit0echo"不知道"&&exit04.3用好判斷式子任務(wù)3使用Shellscript的默認(rèn)變量($0,$1...)那么,script是怎么實(shí)現(xiàn)這個(gè)功能的呢?其實(shí)script針對(duì)參數(shù)已經(jīng)設(shè)置好了一些變量名稱。對(duì)應(yīng)如下:/path/to/scriptnameopt1opt2opt3opt4$0$1$2$3$44.3用好判斷式子任務(wù)3使用Shellscript的默認(rèn)變量($0,$1...)[root@wwwscripts]#vimsh07.sh#!/bin/sh#2019/12/8 申海杰echo"本腳本程序的名字是:$0“echo"你執(zhí)行本腳本時(shí)提供的參數(shù)個(gè)數(shù)是:$#“["$#"-lt2]&&echo"你提供的參數(shù)少于兩個(gè),程序停止執(zhí)行。"&&exit0echo"你提供的所有參數(shù)是:$@“echo"第一個(gè)參數(shù)是:$1“echo"第二個(gè)參數(shù)是:$2"4.3用好判斷式子任務(wù)4shift:造成參數(shù)變量號(hào)碼偏移[root@wwwscripts]#vish08.sh#!/bin/bash#2019/12/8 申海杰echo"參數(shù)個(gè)數(shù)是:$#“echo"所有參數(shù):$@“shiftecho"參數(shù)個(gè)數(shù)是:$#“echo"所有參數(shù):$@“shift3echo"參數(shù)個(gè)數(shù)是:$#“echo"所有參數(shù):$@"4.4使用條件判斷式子任務(wù)1利用if…then1.單層、簡(jiǎn)單條件判斷式如果你只有一個(gè)判斷式要進(jìn)行,那么我們可以簡(jiǎn)單地這樣做:if[條件判斷式];then
當(dāng)條件判斷式成立時(shí),可以進(jìn)行的命令工作內(nèi)容;fi<==將if反過(guò)來(lái)寫,就成為fi了!結(jié)束if之意!
&&代表AND;
||代表or。4.4使用條件判斷式子任務(wù)1利用if…then[root@wwwscripts]#cpsh06.shsh06-2.sh<==這樣改得比較快[root@wwwscripts]#vimsh06-2.sh#!/bin/bash#2019/12/8 申海杰read-p"請(qǐng)回答(y/n):"answerif["$answer"=="y"]||["$answer"=="Y"];then echo"是" exit0fiif["$answer"=="n"]||["$answer"=="N"];then echo"否“ exit0fiecho"不知道"&&exit04.4使用條件判斷式子任務(wù)1利用if…then2.多重、復(fù)雜條件判斷式#一個(gè)條件判斷,分成功進(jìn)行與失敗進(jìn)行(else)if[條件判斷式];then
當(dāng)條件判斷式成立時(shí),可以進(jìn)行的命令工作內(nèi)容;else
當(dāng)條件判斷式不成立時(shí),可以進(jìn)行的命令工作內(nèi)容;fi4.4使用條件判斷式子任務(wù)1利用if…then2.多重、復(fù)雜條件判斷式如果考慮更復(fù)雜的情況,則可以使用:#多個(gè)條件判斷(if…elif…elif…else)分多種不同情況運(yùn)行if[條件判斷式一];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)容;fi4.4使用條件判斷式子任務(wù)1利用if…then[root@wwwscripts]#cpsh06-2.shsh06-3.sh[root@wwwscripts]#vish06-3.sh#!/bin/bash#2019/12/8 申海杰read-p"請(qǐng)回答(y/n):"answerif["$answer"=="y"]||["$answer"=="Y"];then echo"是“elif["$answer"=="n"]||["$answer"=="N"];then echo"否“else echo"不知道“fi4.4使用條件判斷式子任務(wù)1利用if…then[root@wwwscripts]#vimsh09.sh#!/bin/bash#2019/12/8 申海杰if["$1"=="start"];then echo"服務(wù)啟動(dòng)中。。。"elif["$1"==""];then echo"你必須提供參數(shù),格式:{$0參數(shù)}"else echo"允許的參數(shù)是start,格式:{$0start}“fi4.4使用條件判斷式子任務(wù)1利用if…then[root@www~]#netstat-tulnActiveInternetconnections(onlyservers)ProtoRecv-QSend-QLocalAddressForeignAddressStatetcp00:111:*LISTENtcp00:631:*LISTENtcp00:25:*LISTENtcp00:::22:::*LISTENudp00:111:*udp00:631:*#封包格式
本地IP:端口
遠(yuǎn)程IP:端口
是否監(jiān)聽4.4使用條件判斷式子任務(wù)1利用if…then[root@wwwscripts]#vimsh10.sh#!/bin/bash#2019/12/8 申海杰echo"本程序會(huì)檢測(cè)你的Linux系統(tǒng)已開啟的服務(wù)信息,包括ssh服務(wù)、www服務(wù)?!皌esting=$(netstat-tuln|grep'.*:22.*’)if["$testing"!=""];then echo"你的系統(tǒng)正在運(yùn)行ssh服務(wù)?!癴itesting=$(netstat-tuln|grep'.*:80.*’)if["$testing"!=""];then echo"你的系統(tǒng)正在運(yùn)行www服務(wù)?!癴i4.4使用條件判斷式子任務(wù)1利用if…then[root@wwwscripts]#vimsh11.sh#!/bin/bash#2019/12/8 申海杰echo"這個(gè)程序會(huì)顯示你還有多久畢業(yè)?!皉ead-p"請(qǐng)輸入你入學(xué)的時(shí)間(例如20190901):"indatedate1=$(echo$indate|grep'[0-9]\{8\}’)if["date1"==""];then echo"你輸入的日期不符合要求?!?exit1fi4.4使用條件判斷式子任務(wù)1利用if…thenindate_s=`date--date="$indate"+%s`outdate_s=$(($indate_s+365*4*24*60*60))nowdate_s=`date+%s`result=$((($outdate_s-$nowdate_s)/60/60/24))if["$result"-lt"0"];then echo"你在$((-1*$result))天前已經(jīng)畢業(yè)了!“Else echo"你還有$result天畢業(yè)!“fi4.4使用條件判斷式子任務(wù)2利用case…esac判斷case$變量名稱in <==關(guān)鍵字為case,變量前有$符"第一個(gè)變量?jī)?nèi)容") <==每個(gè)變量?jī)?nèi)容建議用雙引號(hào)括起來(lái),關(guān)鍵字則為小括號(hào))
程序段 ;; <==每個(gè)類別結(jié)尾使用兩個(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)容的其他程序運(yùn)行段 exit1 ;;esac <==最終的case結(jié)尾!思考一下case反過(guò)來(lái)寫是什么4.4使用條件判斷式子任務(wù)2利用case…esac判斷[root@wwwscripts]#vimsh09-2.sh#!/bin/bash#2019/12/8 申海杰case$1in "start") echo"服務(wù)啟動(dòng)中。。。“ ;; "") echo"你必須提供參數(shù),格式:{$0參數(shù)}“ ;; *) echo"允許的參數(shù)是start,格式:{$0start}“ ;;esac4.4使用條件判斷式子任務(wù)2利用case…esac判斷下面以一個(gè)例子來(lái)進(jìn)一步說(shuō)明:讓用戶輸入start|restart|stop,并且將用戶的變量顯示到屏幕上,如果不是start|restart|stop時(shí),就告訴用戶僅有這三種選擇。[root@wwwscripts]#vimsh12.sh#!/bin/bash#2019/12/8 申海杰echo"這個(gè)程序?qū)⒏鶕?jù)你輸?shù)膮?shù)執(zhí)行不同的操作?!?read-p"請(qǐng)輸入你要執(zhí)行的功能:"choice#case$choicein4.4使用條件判斷式子任務(wù)2利用case…esac判斷case$1in "start") echo"服務(wù)啟動(dòng)中。。?!? ;; "restart") echo"服務(wù)重啟中。。?!? ;; "stop") echo"服務(wù)停止中。。。“ ;; *) echo"使用方法:$0{start|restart|stop}“ ;;esac4.4使用條件判斷式子任務(wù)3利用function功能我們將sh12.sh改寫一下,自定義一個(gè)名為printit的函數(shù):[root@wwwscripts]#vimsh12-2.sh#!/bin/bash#2019/12/8 申海杰functionpri(){ echo-n"服務(wù)正在“}echo"這個(gè)程序?qū)⒏鶕?jù)你輸?shù)膮?shù)執(zhí)行不同的操作?!?read-p"請(qǐng)輸入你要執(zhí)行的功能:"choice#case$choicein4.4使用條件判斷式子任務(wù)3利用function功能case$1in "start") pri;echo"啟動(dòng)中。。。“ ;; "restart") pri;echo"重啟中。。。“ ;; "stop") pri;echo"停止中。。?!? ;; *) echo"使用方法:$0{start|restart|stop}“ ;;esac4.4使用條件判斷式子任務(wù)3利用function功能我們將上面的例子再次改寫一下:[root@wwwscripts]#vimsh12-3.sh#!/bin/bash#2019/12/8 申海杰functionpri(){ echo"服務(wù)正在$1“}echo"這個(gè)程序?qū)⒏鶕?jù)你輸?shù)膮?shù)執(zhí)行不同的操作?!?read-p"請(qǐng)輸入你要執(zhí)行的功能:"choice#case$choicein4.4使用條件判斷式子任務(wù)3利用function功能case$1in "start") pri"啟動(dòng)中。。?!? ;; "restart") pri"重啟中。。?!? ;; "stop") pri"停止中。。?!? ;; *) echo"使用方法:$0{start|restart|stop}“ ;;esac4.5使用循環(huán)(loop)
1.
whiledodone,untildodone(不定循環(huán))
2.for…do…done(固定循環(huán))
3.for…do…done的數(shù)值處理4.5.1whiledodone,untildodone(不定循環(huán))一般來(lái)說(shuō),不定循環(huán)最常見的就是底下這兩種狀態(tài)了。while[condition] <==中括號(hào)內(nèi)的狀態(tài)就是判斷式do <==do是循環(huán)的開始!
程序段落done <==done是循環(huán)的結(jié)束4.5使用循環(huán)(loop)4.5.1whiledodone,untildodone(不定循環(huán))while的中文是“當(dāng)....時(shí)”,所以,這種方式說(shuō)的是“當(dāng)condition條件成立時(shí),就進(jìn)行循環(huán),直到condition的條件不成立才停止”的意思。還有另外一種不定循環(huán)的方式:until[condition]do
程序段落done4.5使用循環(huán)(loop)4.5.1whiledodone,untildodone(不定循環(huán))[root@wwwscripts]#vimsh13.sh#!/bin/bash#2019/12/8 申海杰while["$answer"!="yes"-a"$answer"!="YES"]do read-p"輸入yes或者YES停止程序:"answerdoneecho"你的輸入時(shí)正確的!"4.5使用循環(huán)(loop)4.5.1whiledodone,untildodone(不定循環(huán))那如果使用until呢?[root@wwwscripts]#vimsh13-2.sh#!/bin/bash#2019/12/8 申海杰until["$answer"=="yes"-o"$answer"=="YES"]do read-p"輸入yes或者YES停止程序:"answerdoneecho"你的輸入時(shí)正確的!"4.5使用循環(huán)(loop)4.5.1whiledodone,untildodone(不定循環(huán))如果想要計(jì)算1+2+3+....+100的值。利用循環(huán),可以這樣寫程序:[root@wwwscripts]#vimsh14.sh#!/bin/bash#2019/12/8 申海杰s=0i=0while["$i"!="100"]do i=$(($i+1)) s=$(($s+$i))doneecho"1到100的所有數(shù)字的和是:$s"4.5使用循環(huán)(loop)4.5.2for…do…done(固定循環(huán))while、until的循環(huán)方式必須要符合某個(gè)條件的狀態(tài),而for這種語(yǔ)法則是已經(jīng)知道要進(jìn)行幾次循環(huán)的狀態(tài)。語(yǔ)法如下所示:forvarincon1con2con3...do
程序段done4.5使用循環(huán)(loop)4.5.2for…do…done(固定循環(huán))假設(shè)有4個(gè)學(xué)生,分別是張三李四王五趙六,如果每一行都按“學(xué)生:...”之類的樣式輸出,則可以如此撰寫程序:[root@wwwscripts]#vimsh15.sh#!/bin/bash#2019/12/8 申海杰forstudin張三李四王五趙六do echo"學(xué)生:$stud“done4.5使用循環(huán)(loop)4.5.2for…do…done(固定循環(huán))程序如下:[root@wwwscripts]#vimsh16.sh#!/bin/bash#2019/12/8 申海杰users=$(cut-d':'-f1/etc/passwd)forusernamein$usersdo id$username|grep'.*id=5..(.*’done4.5使用循環(huán)(loop)4.5.2for…do…done(固定循環(huán))舉例來(lái)說(shuō),我想要利用ping這個(gè)可以判斷網(wǎng)絡(luò)狀態(tài)的命令來(lái)進(jìn)行網(wǎng)絡(luò)狀態(tài)的實(shí)際檢測(cè),要偵測(cè)的域是本機(jī)所在的~00。由于有100臺(tái)主機(jī),總不會(huì)要我在for后面輸入1到100吧?此時(shí)可以這樣撰寫程序:[root@wwwscripts]#vimsh17.sh#!/bin/bash#2019/12/8 申海杰network="192.168.1” #先定義一個(gè)網(wǎng)絡(luò)號(hào)(網(wǎng)絡(luò)ID)4.5使用循環(huán)(loop)4.5.2for…do…done(固定循環(huán))forhostin$(seq110)do ping-c1-w1$network.$host>/dev/null&&result=0||result=1 if["$result"=="0"];then echo"$network.$host可以ping通?!?else echo"$network.$hostping不通?!?fidone4.5使用循環(huán)(l
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026浙江紹興市應(yīng)急管理局選調(diào)下屬事業(yè)單位人員1人參考考試題庫(kù)附答案解析
- 2026河南周口淮陽(yáng)楚氏骨科醫(yī)院招聘?jìng)淇伎荚囋囶}附答案解析
- 街道生產(chǎn)經(jīng)營(yíng)監(jiān)管制度
- 2026國(guó)家電投云南國(guó)際校園招聘48人備考考試試題附答案解析
- 調(diào)運(yùn)員安全生產(chǎn)責(zé)任制度
- 安全生產(chǎn)診斷檢查制度
- 制劑生產(chǎn)計(jì)劃管理制度
- 塑粉生產(chǎn)車間制度
- 生產(chǎn)車間工模管理及制度
- 2026山東事業(yè)單位統(tǒng)考煙臺(tái)黃渤海新區(qū)鎮(zhèn)街招聘7人參考考試題庫(kù)附答案解析
- 湖北省2024-2025學(xué)年高二上學(xué)期期末考試英語(yǔ)含答案
- 鐵路物資管理培訓(xùn)課件
- 2025年國(guó)家能源集團(tuán)有限責(zé)任公司招聘筆試面試真題題庫(kù)(含答案)
- (人教A版)必修一高一數(shù)學(xué)上冊(cè)同步分層練習(xí)1.3 并集與交集第1課時(shí)(原卷版)
- 完整銀行貸款合同5篇
- 2025版地暖施工項(xiàng)目進(jìn)度管理與結(jié)算合同
- 2025年事業(yè)單位公開招聘考試(D類)《職業(yè)能力傾向測(cè)驗(yàn)》新版真題卷(附詳細(xì)解析)
- 2025年尾礦綜合利用技術(shù)突破與生態(tài)修復(fù)技術(shù)協(xié)同創(chuàng)新研究
- 評(píng)定與追溯管理制度
- 武漢科技大學(xué)c語(yǔ)言期末試卷及答案
- T/CAS 612-2022碳中和管理體系要求
評(píng)論
0/150
提交評(píng)論