詳解Shell編程之if語(yǔ)句實(shí)戰(zhàn)(小結(jié))
對(duì)于if語(yǔ)句,其實(shí)很多人都肯定的聽(tīng)說(shuō)過(guò),那么if語(yǔ)句到底是什么,簡(jiǎn)單的說(shuō),就類似于漢語(yǔ)里面的如果----那么,if語(yǔ)句是linux運(yùn)維人員在實(shí)際環(huán)境中使用的最頻繁也是最重要的語(yǔ)句!?。?/p>
一、if條件語(yǔ)句
1、單分支語(yǔ)句結(jié)構(gòu)
第一種語(yǔ)法如下:
if <條件表達(dá)式> then 指令 fi
第二種語(yǔ)法
if <條件表達(dá)式>; then 指令 fi
在以上這兩種方式中我還是喜歡用第一種,這個(gè)是看個(gè)人習(xí)慣的。在上面的兩個(gè)語(yǔ)法中<條件表達(dá)式>可以是 test [] [[]] (())等條件表達(dá)式,甚至可以使用命令作為條件表達(dá)式。注意:每個(gè)if語(yǔ)句都是以if開(kāi)頭 fi結(jié)束,中間并帶有then;
其實(shí)很簡(jiǎn)單,舉個(gè)例子如下:
if [ -f file ] then echo "是一個(gè)普通文件" else echo "不是一個(gè)普通文件" exit 1 fi
剖析:如果file是一個(gè)普通文件,那么就執(zhí)行echo "是一個(gè)普通文件" 否則 輸出一條"不是一個(gè)普通文件" 最后退出腳本
其實(shí)以下的這段命令更能清晰的了解if語(yǔ)句如下:
如果 <你不會(huì)if語(yǔ)句> 那么 那肯定長(zhǎng)的不帥 果如
2、以上就是單分支的if語(yǔ)句,接下來(lái)看看雙分支的if語(yǔ)法結(jié)構(gòu)
if <條件表達(dá)式> then 指令一 else 指令二 fi
以上就是單分支的if語(yǔ)句結(jié)構(gòu),那么在舉個(gè)例子如下:
if [ -f file ] then echo "這是一個(gè)普通文件" else echo "NONONO" fi
這個(gè)和以上的例子是一樣的。同樣是測(cè)試file是不是一個(gè)普通文件,如果是,那么就輸出指令1 否則那么就輸出指令2
到這里我們?cè)趤?lái)一個(gè)形象描述
如果 <你不會(huì)if語(yǔ)句> 那么 就快點(diǎn)學(xué),快點(diǎn)練 否則 你永遠(yuǎn)都不可能學(xué)會(huì) 果如
我們發(fā)現(xiàn) 單分支和雙分支的區(qū)別就在于一個(gè)有else 一個(gè)沒(méi)有。
3、多分支if語(yǔ)句結(jié)構(gòu)
我們?cè)谏厦嬲f(shuō)了 單分支和雙分支 這里又有了一個(gè)多分支,我們可以理解為雙分支里面包含了單分支,那么多分支里面肯定包含了單分支+雙分支:個(gè)人理解,好像有點(diǎn)繞? 先來(lái)看看多分支吧 如下:
if 語(yǔ)句多分支結(jié)構(gòu)主體為:如果.....那么....否則如果.....那么.....否則如果.....那么,,,,
例1:
if [ -f file ] then echo "yes yes yes" elif [ -z file ] then echo "yes yes" else echo "nonono" fi
解釋如下圖:
看完圖還是沒(méi)理解? 沒(méi)有關(guān)系 如下:
到這里應(yīng)該是沒(méi)有問(wèn)題了~~
單分支if條件語(yǔ)句實(shí)踐
把下面的測(cè)試文件中條件表達(dá)式改為if條件語(yǔ)句
[root@shell-yankerp sh]# [ -f file ] && echo "yes" || echo "no" yes
修改如下:
if [ -f file ] then echo "yes" else echo "no" fi
運(yùn)行結(jié)果如下:
[root@shell-yankerp sh]# [ -f file ] && echo "yes" || echo "no" yes [root@shell-yankerp sh]# sh cs.sh yes [root@shell-yankerp sh]# cat cs.sh #!/bin/bash # Maintenance:<ywyankerp@163.com> # BINLOG:www.ywyankai.cn # DATE:03:31:35 CST, Sunday, 02 month, 2018, 04 # Test scripts if [ -f file ] then echo "yes" else echo "no" fi [root@shell-yankerp sh]#
到這里if的一些基本語(yǔ)法應(yīng)該掌握了,那么我們接下來(lái),來(lái)點(diǎn)實(shí)際的。
實(shí)戰(zhàn)1:開(kāi)發(fā)shell腳本檢測(cè)Nginx服務(wù)是否正常啟動(dòng) 如果宕機(jī),那么就設(shè)置郵箱報(bào)警?。?!
其實(shí)此章有很多的案例,但是還是那句話,我還是想用我的思想來(lái)編寫(xiě)整個(gè)腳本,這樣能表達(dá)出來(lái)我的整個(gè)過(guò)程!
首先我們要知道為什么要寫(xiě)這個(gè)腳本?,我們的目的是要干什么?最后需要實(shí)現(xiàn)什么樣的效果?,寫(xiě)了這個(gè)腳本到底能實(shí)現(xiàn)什么樣的功能? 我感覺(jué)這個(gè)是我們首先需要考慮的問(wèn)題。隨后我們就可以帶著這些問(wèn)題,去編寫(xiě)我們的shell腳本
那么我們可以根據(jù)以上的需求分為三塊 如:如何查看Nginx服務(wù)是否啟動(dòng)? 我們?nèi)绾尾榭碞ginx服務(wù)宕機(jī)時(shí)候的一些情況。 最后我們需要知道我們用什么樣的工具來(lái)實(shí)現(xiàn)這個(gè)郵箱報(bào)警。
1、如何查看Nginx啟動(dòng)?
我們可以通過(guò)netstat -anput | grep nginx 來(lái)查看Nginx是否啟動(dòng)如下:
首先通過(guò)上圖我們得到的信息是:我們可以通過(guò)上面那條命令來(lái)查看,那么接下來(lái)我們肯定是需要寫(xiě)在腳本中的,通過(guò)我們的if條件測(cè)試語(yǔ)句來(lái)寫(xiě),最后我們進(jìn)行比較,所以這時(shí)候我們最好的方法是提取它的行號(hào),如下:
也就是說(shuō) 使用wc -l這個(gè)命令可以知道它的行號(hào),只有一行 所以顯示1,那么我們來(lái)關(guān)閉Nginx再次查看
當(dāng)我們關(guān)閉Nginx時(shí) 它已經(jīng)沒(méi)有80端口以及Nginx服務(wù)名的一些信息了,所以顯示0 那么我們現(xiàn)在又能得出一個(gè)結(jié)論,如果 netstat -anput | grep nginx | wc -l 輸出的為1 那么Nginx是啟動(dòng)的 輸出的為0 那么Nginx已經(jīng)停止運(yùn)行;
到這里我們的兩個(gè)信息已經(jīng)知道了:如何查看Nginx服務(wù)是否啟動(dòng)? 我們?nèi)绾尾榭碞ginx服務(wù)宕機(jī)時(shí)候的一些情況。
那么就接下來(lái)就剩下郵件告警了,我們可以使用sendmail來(lái)實(shí)現(xiàn),安裝如下:
1.安裝相關(guān)的依賴包
[root@shell-yankerp sh]# yum install perl-Net-SSLeay perl-IO-Socket-SSL -y
2.解壓并安裝
[root@shell-yankerp ~]# tar zxf sendEmail-v1.56.tar.gz [root@shell-yankerp ~]# cd sendEmail-v1.56/ [root@shell-yankerp sendEmail-v1.56]# cp sendEmail /usr/local/bin/sendEmail
到這里我們先發(fā)個(gè)郵件試試,確保郵件可以發(fā)送
[root@shell-yankerp ~]# /usr/local/bin/sendEmail -f yankerpcs@163.com -t ywyankerp@163.com -s smtp.163.com -u "Nginx測(cè)試" -o message-content-type=html -o message-charset=utf8 -xu yankerpcs -xp ******* -m "Nginx正在測(cè)試"
這邊我已經(jīng)收到了郵件報(bào)警測(cè)試的郵件了
3、接下來(lái)就可以開(kāi)始寫(xiě)腳本了如下:
#!/bin/bash # Maintenance:<ywyankerp@163.com> # BINLOG:www.ywyankai.cn # DATE:03:31:35 CST, Sunday, 02 month, 2018, 04 # Test scripts NX=`netstat -anput | grep nginx | wc -l` if [ "$NX" -eq 0 ] then /usr/local/nginx/sbin/nginx fi if [ "$?" -ne 0 ] then /usr/local/bin/sendEmail -f yankerpcs@163.com -t ywyankerp@163.com -s smtp.163.com -u "Nginx報(bào)警" -o message-content-type=html -o message-charset=utf8 -xu yankerpcs -xp ******* -m "Nginx啟動(dòng)失敗盡快查 看?。?!" &> /dev/null fi
在這里我會(huì)一條條的解釋:
NX=`netstat -anput | grep nginx | wc -l` :這就是上面測(cè)試的那條命令,如果Nginx宕機(jī)就輸出0 正常運(yùn)行那么就輸出1 來(lái)確定Nginx運(yùn)行狀況賦值給了變量NX
if [ "$NX" -eq 0 ] //如果NX執(zhí)行的結(jié)果為0 then //那么 /usr/local/nginx/sbin/nginx //啟動(dòng)nginx服務(wù) fi
最后結(jié)束符fi
if [ "$?" -ne 0 ] then /usr/local/bin/sendEmail -f yankerpcs@163.com -t ywyankerp@163.com -s smtp.163.com -u "Nginx報(bào)警" -o message-content-type=html -o message-charset=utf8 -xu yankerpcs -xp ****** -m "Nginx啟動(dòng)失敗盡快查 看?。?!" &> /dev/null fi
當(dāng)我們啟動(dòng)Nginx啟動(dòng)失敗時(shí) 我們?cè)谶@里使用特殊的狀態(tài)變量$? 查看上一條命令是否為0 是0就是成功。解釋:如果啟動(dòng)Nginx失敗,那么就會(huì)執(zhí)行 /usr/local/bin.....就是這個(gè)郵箱報(bào)警程序 輸出一條 Nginx啟動(dòng)失敗盡快查看?。?!
最后的腳本是這樣的 如下:
那么接下來(lái)我們執(zhí)行:
1.首先我們模擬Nginx宕機(jī),隨后運(yùn)行腳本
在第一條命令我們可以看到nginx沒(méi)有啟動(dòng) 當(dāng)我們運(yùn)行腳本它檢測(cè)到了Nginx宕機(jī)后就會(huì)執(zhí)行啟動(dòng)操作是以下語(yǔ)句實(shí)現(xiàn)的如下:
NX=`netstat -anput | grep nginx | wc -l` if [ "$NX" -eq 0 ] then /usr/local/nginx/sbin/nginx fi
2、我們嘗試修改Nginx的啟動(dòng)路徑,故意出現(xiàn)Nginx啟動(dòng)失敗的情節(jié),來(lái)測(cè)試郵箱是否能夠正常接收
修改完成后運(yùn)行此腳本
實(shí)現(xiàn)此效果的腳本段如下:
if [ "$?" -ne 0 ] then /usr/local/bin/sendEmail -f yankerpcs@163.com -t ywyankerp@163.com -s smtp.163.com -u "Nginx報(bào)>警" -o message-content-type=html -o message-charset=utf8 -xu yankerpcs -xp ****** -m "Nginx啟動(dòng)失敗盡>快查看!?。? &> /dev/null fi
隨后我們添加計(jì)劃任務(wù) 每1分鐘執(zhí)行一次腳本
其實(shí)到這里我們的一個(gè)實(shí)例就結(jié)束了,雖然這表面上是一個(gè)實(shí)例,但是MySQL PHP? SSHD這些各種服務(wù)的檢測(cè)腳本那么肯定是沒(méi)有任何的問(wèn)題了,包括檢測(cè)磁盤(pán)空間的占用情況等等,都是可以舉一反三的,在這里我就不在演示了。
本次就到這里,希望對(duì)您有所幫助,再見(jiàn)!小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
- Linux命令行和shell腳本編程寶典 Richard Blum
- shell腳本編程之for語(yǔ)句、if語(yǔ)句使用介紹
- Linux shell腳本編程if語(yǔ)句的使用方法(條件判斷)
- 5個(gè)Shell腳本編程入門(mén)練習(xí)例子
- Shell腳本編程中常用的數(shù)學(xué)運(yùn)算實(shí)例
- shell 編程中空格的使用方法
- Shell 編程:Bash空格的那點(diǎn)事
- shell腳本編程實(shí)現(xiàn)9*9乘法表
- Linux Shell 腳本編程入門(mén)教程
- Shell腳本編程之判斷語(yǔ)句
- shell腳本編程之循環(huán)語(yǔ)句
- Shell編程中while與for的區(qū)別及用法詳解
- Linux下Shell編程快捷鍵大全(日常整理)
- 詳解Shell編程之變量數(shù)值計(jì)算(一)
- Shell編程之case語(yǔ)句實(shí)戰(zhàn)(小結(jié))
- 對(duì)Linux下shell編程之for循環(huán)的實(shí)例講解
- Shell腳本編程30分鐘入門(mén)(小結(jié))
- shell編程入門(mén)之變量,字符串,數(shù)組,函數(shù)使用方法總結(jié)
相關(guān)文章
linux 守護(hù)進(jìn)程詳解及建立守護(hù)進(jìn)程
這篇文章主要介紹了linux 守護(hù)進(jìn)程詳解及建立守護(hù)進(jìn)程的相關(guān)資料,需要的朋友可以參考下2017-04-04Shell實(shí)現(xiàn)讀取ini格式配置文件方法
這篇文章主要介紹了Shell實(shí)現(xiàn)讀取ini格式配置文件方法,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-02-02linux shell命令行選項(xiàng)與參數(shù)用法詳解
本文介紹了linux shell中使用命令行選項(xiàng)與命令行參數(shù)的方法,在bash中,可以用以下三種方式來(lái)處理命令行參數(shù),每種方式都有自己的應(yīng)用場(chǎng)景2014-04-04shell編程中for循環(huán)語(yǔ)句的實(shí)現(xiàn)過(guò)程及案例
Bash?Shell中主要提供了三種循環(huán)方式:for、while和until,下面這篇文章主要給大家介紹了關(guān)于shell編程中for循環(huán)語(yǔ)句的實(shí)現(xiàn)過(guò)程及案例,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04Shell腳本編程中常用的數(shù)學(xué)運(yùn)算實(shí)例
這篇文章主要介紹了Shell腳本編程中常用的數(shù)學(xué)運(yùn)算實(shí)例,包含最基本的加減乘除,還有質(zhì)數(shù)、偶數(shù)的判斷等,需要的朋友可以參考下2014-06-06shell腳本實(shí)現(xiàn)linux系統(tǒng)文件完整性檢測(cè)
這篇文章主要介紹了shell腳本實(shí)現(xiàn)linux系統(tǒng)文件完整性檢測(cè),本文給出的腳本使用對(duì)比MD5的方法,檢測(cè)linux系統(tǒng)文件是否被替換等問(wèn)題,需要的朋友可以參考下2014-12-12