(17)-第4章 shell編程Linux操作系統(tǒng)_第1頁
(17)-第4章 shell編程Linux操作系統(tǒng)_第2頁
(17)-第4章 shell編程Linux操作系統(tǒng)_第3頁
(17)-第4章 shell編程Linux操作系統(tǒng)_第4頁
(17)-第4章 shell編程Linux操作系統(tǒng)_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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)像是早期的批處理,即將一些命令匯總起來一次運(yùn)行。但是Shellscript擁有更強(qiáng)大的功能,那就是它可以進(jìn)行類似程序(program)的撰寫,并且不需要經(jīng)過編譯(compile)就能夠運(yùn)行,非常方便。同時(shí),我們還可以通過shellscript來簡(jiǎn)化我們?nèi)粘5墓ぷ鞴芾?。在整個(gè)Linux的環(huán)境中,一些服務(wù)(service)的啟動(dòng)都是通過shellscript來運(yùn)行的,如果你對(duì)于script不了解,一旦發(fā)生問題,可真是會(huì)求助無門??!

職業(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)單地說,shellscript就像是早期DOS年代的批處理(.bat),最簡(jiǎn)單的功能就是將許多命令寫在一起,讓使用者很輕易地就能夠一下子處理復(fù)雜的操作(運(yùn)行一個(gè)文件“shellscript”,就能夠一次運(yùn)行多個(gè)命令)。而且shellscript更提供數(shù)組、循環(huán)、條件與邏輯判斷等重要功能,讓用戶也可以直接以shell來撰寫程序,而不必使用類似C程序語言等傳統(tǒng)程序撰寫的語法。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ì)路徑”的方式來執(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反過來寫,就成為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ù)。“testing=$(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ù)。“fi4.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)括起來,關(guān)鍵字則為小括號(hào))

程序段 ;; <==每個(gè)類別結(jié)尾使用兩個(gè)連續(xù)的分號(hào)來處理"第二個(gè)變量?jī)?nèi)容")

程序段 ;;*) <==最后一個(gè)變量?jī)?nèi)容都會(huì)用*來代表所有其他值

不包含第一個(gè)變量?jī)?nèi)容與第二個(gè)變量?jī)?nèi)容的其他程序運(yùn)行段 exit1 ;;esac <==最終的case結(jié)尾!思考一下case反過來寫是什么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è)例子來進(jìn)一步說明:讓用戶輸入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))一般來說,不定循環(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í)”,所以,這種方式說的是“當(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這種語法則是已經(jīng)知道要進(jìn)行幾次循環(huán)的狀態(tài)。語法如下所示: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))舉例來說,我想要利用ping這個(gè)可以判斷網(wǎng)絡(luò)狀態(tà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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論