shell指令碼編寫思路和執行個體講解_shell

來源:互聯網
上載者:User
shell指令碼編寫思路和執行個體講解 前言

常聽見身邊有很多學習shell指令碼的朋友抱怨shell指令碼不好寫,好不容易寫出來的指令碼一直報錯,符號空格又太多,錯了一個就無法運行還不好排查錯誤。

客觀講shell指令碼的簡潔程度確實有些堪憂,但是在Linux營運工作中shell指令碼運用得非常廣,在有些場合用shell會非常有效率,所以shell指令碼編寫是必須掌握的技能之一,我們還不能捨棄。 方法要點

言歸正傳,接下來我將分享我在編寫shell指令碼的時候學到的經驗和寫shell指令碼的方法。

1.理清思路:在我們想實現一個功能需要寫指令碼的時候是切忌不要想到就寫,避免需要什麼功能就先寫個什麼命令再去完善,這種寫法常常會出現在結構上很難調整的問題。在我們開始寫指令碼之前一定要事先理清楚要怎麼去實現這個功能,包括用什麼命令和命令的先後順序。

2.全域觀:當我們理清指令碼的思路之後,我們這個時候也不能馬上就開始寫,這個時候我們需要在腦海中思考每一個步驟中可能出現的情況,當出現各種情況後如何應對。在shell指令碼中有可能我們要實現一個看似簡單的功能會需要有多個條件判斷,因為出現在我們當前系統上的情況只是在眾多情況中的一種,我們要實現讓指令碼在任何機器上都能正常運行就必須有“全域觀”。通俗講就是一個排除bug的過程。

3.心細如絲:正如大家感慨的一樣,shell指令碼有非常多的引號括弧空格,每一種意義不一樣,多個空格少個空格意義又不一樣,寫個幾十行的shell指令碼能一次性寫完就無錯運行還是有一些難度的。我的在學習shell指令碼一開始就強行給自己養成一個習慣,每寫完一行就檢查一次各種符號括弧,剛開始速度非常慢,但是寫得多了速度就越來越快而且出錯率也越來越低,當養成習慣以後再去寫那些符號就成了習慣沒有剛開始那麼痛苦了。

4.好記性不如爛鍵盤:有一句不好聽的話雖然不好聽,但是能提醒到一些正在學習shell指令碼的朋友說出來也挺好。當你在抱怨shell指令碼如何難寫如何易出錯的時候那麼你總共寫過多少行shell。你敲過多少次鍵盤。當你無數次練習,把鍵盤都敲到字都掉完了之後還會說這句話嗎。對。你還會說這句話,但已經不是抱怨而是評價。 執行個體

編寫指令碼checkdisk.sh,運行效果:檢查磁碟分割空間和inode使用率,如果超過80%,就發廣播警告空間將滿

看到題目後先審題,然後按照我們上面的方法來。

第一步,我們先把要實現的功能理清。

要查看磁碟分割和inode的使用方式那麼會用到 df 和df -i 命令
提取出df命令中使用率的部分會用到grep用到cut以及head還有tail等這些對文本處理的命令
要比較數值那麼可能會用到中括弧和數值比較
最後發廣播要用到wall命令
因為磁碟分割並不是只有一個,或許還會用到if條件判斷以及迴圈。

這個時候我們的思路可以是這樣:
1.先用grep等文本處理命令取出df中的百分比值
2.用中括弧判斷這些值這些值是否大於80
3.將大於百分之80的值對應的分區用wall進行廣播

第二步,思考每一步會出現的問題和情況然後應對。

在上一步中我們已經把主線理清,既然線路已經規划了那麼就開始鋪路吧。

1.要取出df命令中的百分比值我們首先需要觀察百分比值在df命中是出現在哪個位置,然後用Regex匹配,之後用cut等命令取出,但是分區有很多個而且還要判斷inode的使用方式所以我們還要搞清楚一共有多少個分區,那麼這裡會用到幾個變數:代表磁碟空間分區個數的變數、代表磁碟inode分區個數的變數、代表被取出的磁碟分割路徑的變數、代表被取出的百分比數值的變數。

2.因為包括inode的話磁碟分割要比較的就很多,如果挨個比較的話就會大大增加指令碼的行數,寫起來非常累,這裡就可以考慮利用分區的個數變數利用迴圈語句來比較每個分區使用量是否達到80%以上以及輸出比較結果,而考慮到還有inode則可以用if elif來判斷。

3.既然路也鋪好了,那就上路吧。

下面我會將我寫的指令碼貼在這裡,可能看起來會有一些長,但是其實只要認真閱讀了我上面所有的闡述就會覺得其實非常簡單。

注意:在指令碼中出現的Regex我將不再細講,如果想瞭解的朋友去我上一篇部落格中查閱一下。指令碼中如cut這些命令具體功能我不做細講,有興趣的朋友可以在網上查詢相關資料。

#!/bin/bash#author:Driver_C#mail:740560896@qq.com#time:2017-06-11#filename:checkdisk.sh             //以上為注釋段linenum=`df | egrep "\<[[:digit:]]{1,3}%.*" | wc -l`#將用Regex取到的磁碟分割個數賦值給linenumtest1=`df | egrep -o "\<[[:digit:]]{1,3}%.*" | tr '%' ' ' | tr -s ' ' |sort -nr | head -n1 | cut -d' ' -f1`#經過一系列的文本處理取出磁碟分割使用量最大的分區的數值賦給test1,這個變數在決定迴圈是否進行的關鍵test2=`df -i | egrep -o "\<[[:digit:]]{1,3}%.*" | tr '%' ' ' | tr -s ' ' |sort -nr | head -n1 | cut -d' ' -f1`#如同上一條命令,df選項多了-i,意義在取出inode使用量最大的分區使用量數值賦給test2,同樣也是迴圈是否進行的關鍵num=1#這個變數在整個判斷過程中非常重要,這個變數用於給while迴圈中判斷當前操作行,判斷之後加1以實現迴圈的if [ "$test1" -ge "80" ];then#這個if的意義在於判斷之前磁碟分割使用率最大的分區是否大於或等於80%,是就執行迴圈依次判斷每個分區 while [ "$num" -le "$linenum" ] #這裡就用到了上面的num和linenum變數,意義在於當num小於或等於磁碟分割行數的時候才執行下面的命令,相當於只要剛才的if判斷有分區使用量大於80%就會把所有分區都放進迴圈裡比較,因為有可能使用量大於80%並不只有一個分區。 do testnum1=`df | egrep -o "\<[[:digit:]]{1,3}%.*" | tr '%' ' ' | tr -s ' ' |sort -nr | head -n"$num" | tail -n1 | head -n1 | cut -d' ' -f1`#這一段命令的功能是用於提取出分區使用量的數值用於後面的比較,這裡注意一下我在命令中num變數的用法,num需要帶進命令中才能實現不同行的提取 testname1=`df | egrep -o "\<[[:digit:]]{1,3}%.*" | tr '%' ' ' | tr -s ' ' |sort -nr | head -n"$num" | tail -n1 | head -n1 | cut -d' ' -f2` #這一段主要功能是提取分區路徑,意義在於上一行命令提取出來的數值如果大於80%,在廣播磁碟分割不足的時候就能給出到底是哪一個分區快要滿了 [ "$testnum1" -ge "80" ] && wall "$testname1"' will be full' #這一段就是比較數值的和輸出的部分,命令很簡單比較好理解,要注意的是用的變數要看清 num=$[num+1] #當迴圈一次之後num加上1再次迴圈的時候就能匹配下一行的資訊了donenum=1#num變數是否重新賦值為1直接決定了下面的判斷是否能正常運行,因為上面的迴圈結束後num的值為7,如果不重新賦值為1那後面的命令相當於沒寫。#這一部分的結構和上面是一樣的,我就不再每條都做解釋,這一段的主要功能是判斷inode的用量。elif [ "$test2" -ge "80" ]thenwhile [ "$num" -le "$linenum" ] do testnum2=`df -i | egrep -o "\<[[:digit:]]{1,3}%.*" | tr '%' ' ' | tr -s ' ' |sort -nr | head -n"$num" | tail -n1 | head -n1 | cut -d' ' -f1` testname2=`df -i | egrep -o "\<[[:digit:]]{1,3}%.*" | tr '%' ' ' | tr -s ' ' |sort -nr | head -n"$num" | tail -n1 | head -n1 | cut -d' ' -f2` [ "$testnum2" -ge "80" ] && wall "$testname2"' Inode will be full'num=$[num+1]doneelseecho "All filesystems are safe"#這裡非常好理解,如果上面的沒有一個匹配上就直接輸出這一段資訊。fi#養成好習慣,用過的變數結束就回收。unset linenumunset test1unset test2unset numunset testnum1unset testname1unset testnum2unset testname2exit

指令碼內容就是以上部分,其實按照我之前的思路,這個指令碼雖然行數不少,但是並不難以理解,寫指令碼沒有想象的那麼難,難的是下不去手。本文這個題目對初學者來說是個不錯的練習。 實驗

看到這裡有朋友會說了,上面稀裡嘩啦說這麼多到底能不能用都不知道畢竟“Linux is interesting”我們需要去玩玩才知道。

實驗系統:CentOS 7.3 1611

[root@centos7 ~]# dfFilesystem     1K-blocks    Used Available Use% Mounted on/dev/sda2      104806400 5397480  99408920   6% /devtmpfs          485308       0    485308   0% /devtmpfs             499980       4    499976   1% /dev/shmtmpfs             499980    7196    492784   2% /runtmpfs             499980       0    499980   0% /sys/fs/cgroup/dev/sda3       52403200   32944  52370256   1% /app/dev/sda1        1038336  172116    866220  17% /boottmpfs             100000       8     99992   1% /run/user/0/dev/sr0         8086368 8086368         0 100% /run/media/root/CentOS 7 x86_64[root@centos7 ~]# 

可以看到我因為在系統上掛了一張光碟片,所以有一個分區是100%,運行一下指令碼試試能不能測出來。

[root@centos7 ~]# checkdisk02.sh Broadcast message from root@centos7.com (pts/0) (Sun Jun 11 15:44:12 2017):/run/media/root/CentOS will be full[root@centos7 ~]# 

完美呈現出大於80%的分區名。

那麼我們現在再把一個分區使用率增加到80%以上看看是否能都顯示出來。

[root@centos7 ~]# dd if=/dev/zero of=/boot/file bs=1M count=800#這裡我們可以用dd命令在/boot目錄下寫入一個檔案把/boot分區撐過80%800+0 records in800+0 records out838860800 bytes (839 MB) copied, 2.30907 s, 363 MB/s[root@centos7 ~]# checkdisk02.sh #執行指令碼Broadcast message from root@centos7.com (pts/0) (Sun Jun 11 15:46:43 2017):/run/media/root/CentOS will be fullBroadcast message from root@centos7.com (pts/0) (Sun Jun 11 15:46:43 2017):/boot will be full[root@centos7 ~]# 

當我們把另外一個分區也撐過80%後依然完美呈現。指令碼運行正常。 結語

其實在我們的學習過程中如果遇到感覺很吃力的東西並不是說自己智力有限了自己能力有限了,那隻不過是給鍵盤敲少了找借口,多敲多練即使理解不了也學會怎麼用了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.