詳解Linux Shell腳本編寫技巧,附實例說明
作者:波波說運維
Linux Shell是一個很難的知識板塊。雖然大家都認真學,基本的語法很都掌握,但有需求時,很難直接上手編程。下面,簡單介紹一下編寫shell腳本的時候的經驗和方法。
Linux Shell是一個很難的知識板塊。雖然大家都認真學,基本的語法很都掌握,但有需求時,很難直接上手編程,要么寫了很久,要么寫不好!對于初學者而言,因為沒有實戰經驗,寫不出來Shell腳本很正常,如果工作了幾年的運維還是寫不出來,那就是沒主動找需求,缺乏練習,缺乏經驗。
方法要點
簡單介紹一下編寫shell腳本的時候的經驗和方法。
- 理清思路:在我們想實現一個功能需要寫腳本的時候是切忌不要想到就寫,避免需要什么功能就先寫個什么命令再去完善,這種寫法常常會出現在結構上很難調整的問題。在我們開始寫腳本之前一定要事先理清楚要怎么去實現這個功能,包括用什么命令和命令的先后順序。
- 全局觀:當我們理清腳本的思路之后,我們這個時候也不能馬上就開始寫,這個時候我們需要在腦海中思考每一個步驟中可能出現的情況,當出現各種情況后如何應對。在shell腳本中有可能我們要實現一個看似簡單的功能會需要有多個條件判斷,因為出現在我們當前系統上的情況只是在眾多情況中的一種,我們要實現讓腳本在任何機器上都能正常運行就必須有“全局觀”。通俗講就是一個排除bug的過程。
- 心細如絲:正如大家感慨的一樣,shell腳本有非常多的引號括號空格,每一種意義不一樣,多個空格少個空格意義又不一樣,寫個幾十行的shell腳本能一次性寫完就無錯運行還是有一些難度的。我的在學習shell腳本一開始就強行給自己養成一個習慣,每寫完一行就檢查一次各種符號括號,剛開始速度非常慢,但是寫得多了速度就越來越快而且出錯率也越來越低,當養成習慣以后再去寫那些符號就成了習慣沒有剛開始那么痛苦了。
- 好記性不如爛鍵盤:有一句不好聽的話雖然不好聽,但是能提醒到一些正在學習shell腳本的朋友說出來也挺好。當你在抱怨shell腳本如何難寫如何易出錯的時候那么你總共寫過多少行shell?你敲過多少次鍵盤?
下面分享幾個shell腳本實例做練習。
1. 檢測服務器是否開啟web服務(監聽80),并判斷服務種類
- #!/bin/bash
- ####################################################
- #檢測服務器是否開啟web服務(監聽80),并判斷服務種類
- ####################################################
- #捕獲監聽80端口的服務名稱
- netstat -lntp|grep ":80"|awk -F '/' '{print $2}'|sort|uniq > /tmp/80.log
- n=`wc -l /tmp/80.log|awk '{print $1}'`
- s1=`cat /tmp/80.log`
- #判斷服務種類函數
- judge_server()
- {
- case $1 in
- httpd)
- echo "this server is apache"
- ;;
- nginx)
- echo "this server is nginx"
- ;;
- tomcat)
- echo "this server is tomcat"
- ;;
- *)
- echo "this server is other"
- ;;
- esac
- }
- if [ $n -eq 0 ]
- then
- echo "no web server!"
- exit
- fi
- if [ $n -eq 1 ]
- then
- judge_server $s1
- else
- echo "there are $n web servers"
- for web in `cat /tmp/80.log`
- judge_server $web
- fi
2. 檢測MySQL服務是否正常,判斷是主庫還是從庫,如是從庫判斷主從服務是否正常
- #!/bin/bash
- ##################################################################
- #檢測MySQL服務是否正常,判斷是主庫還是從庫,如是從庫判斷主從服務是否正常
- ##################################################################
- mysqlcmd="mysql -uroot -p123456"
- #判斷MySQL服務是否正常(正確執行MySQL命令)
- $mysqlcmd -e "show processlist"
- if [ $? -gt 0 ]
- then
- echo "this mysql is wrong."
- else
- #如果是從庫則有返回值
- $mysqlcmd -e "show slave status\G" > /tmp/sql.log
- n=`wc -l /tmp/sql.log|awk '{print $1}'`
- if [ $n -gt 0 ]
- then
- y1=`grep 'Slave_IO_Running:' /tmp/sql.log`|awk -F ':' '{print $2}'|sed 's/ //g'`
- y2=`grep 'Slave_SQL_Running:' /tmp/sql.log`|awk -F ':' '{print $2}'|sed 's/ //g'`
- if [ $y1 == "yes" ] && [ $y2 == "yes" ]
- then
- echo "the slave is ok"
- else
- echo "the slave is wrong"
- fi
- fi
- fi
3. 計算100以內所有能被3整除的正整數的和
- #!/bin/bash
- #############################################
- #計算100以內所有能被3整除的正整數的和
- ############################################
- sum=0
- for i in {1..100}
- do
- #求余數
- n=$[$i%3]
- if [ $n -eq 0 ]
- then
- sum=$[$sum+$i]
- fi
- done
- echo "sum:$sum"
4. 統計內存使用
- #!/bin/bash
- #############################################
- #計算100以內所有能被3整除的正整數的和
- ############################################
- sum=0
- for i in {1..100}
- do
- #求余數
- n=$[$i%3]
- if [ $n -eq 0 ]
- then
- sum=$[$sum+$i]
- fi
- done
- echo "sum:$sum"
責任編輯:趙寧寧
來源:
今日頭條