日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
看完這篇,寫的Shell腳本更加健壯了!

本文轉(zhuǎn)載自微信公眾號「編程珠璣」,作者守望先生 。轉(zhuǎn)載本文請聯(lián)系編程珠璣公眾號。

漢中網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站成立于2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。

 如果秉承著能跑就行的態(tài)度寫shell腳本,是很自在的,但是如果你想要寫出健壯,可靠的shell腳本,可沒那么容易。那么有什么可操作的經(jīng)驗或者方法嗎?

語法檢查

第一個最簡單的方法就是利用工具對腳本進行檢查,這一部分已經(jīng)在《有了這個神器,再也不怕shell寫不對了》中介紹過了,它能最大程度地發(fā)現(xiàn)shell腳本中存在的語法錯誤,如果你還不知道,建議你絕對不要錯過。

而為了保證腳本健壯可靠,那么就需要保證腳本在一些特殊的情況及早出現(xiàn),避免漏網(wǎng)之魚。來看看有哪些可行的技巧。

腳本失敗時即退出

可以在腳本的開頭設(shè)置如下:

 
 
 
  1. set -e

舉個例子:

 
 
 
  1. #!/bin/bash
  2. set -e
  3. lp    #這里運行會出錯
  4. date

這種情況下,運行一旦出錯就會退出,不放過一個問題:

 
 
 
  1. $ ./test.sh
  2. lp: Error - no default destination available.

當然了,這也有不好的地方,有時候命令執(zhí)行本來就可能是失敗的,你還是希望它繼續(xù),可以臨時加上|| true:

 
 
 
  1. #!/bin/bash
  2. set -e
  3. lp  || true  
  4. date

不過個人覺得這樣的設(shè)置用處不是特別大,因為很多時候就是需要處理不同的錯誤情況,而這樣只能要么遇到錯誤退出,要么認為正確,導致無法走到異常分支。

通過set +e設(shè)置回來:

 
 
 
  1. set -e
  2. #command
  3. set +e
  4. #other command

打印腳本執(zhí)行過程

調(diào)試階段,你可能想知道整個過程是執(zhí)行了哪些命令,每條命令都具體執(zhí)行了什么,可以利用下面的方式執(zhí)行:

 
 
 
  1. sh -x test.sh

或者,和上面類似,在開頭加上set -x:

 
 
 
  1. //來源:公眾號【編程珠璣】
  2. //作者:守望先生
  3. #!/bin/bash
  4. set -x
  5. if [ $# -lt 1 ]
  6. then
  7.    echo  "no para"
  8. else
  9.    echo "para 1 $1"
  10. fi

執(zhí)行時,輸出如下:

 
 
 
  1. + [ 0 -le 1 ]
  2. + echo no para
  3. no para

前面帶+的內(nèi)容就是命令實際執(zhí)行的,你可以看到比較條件是什么,變量被展開成了具體內(nèi)容,走到了哪個分支,非常清楚。

顯示未定義的變量

shell中變量沒有定義,仍然是可以使用的,但是它的結(jié)果可能不是你所預期的。舉個例子:

 
 
 
  1. //來源:公眾號【編程珠璣】
  2. //作者:守望先生
  3. #!/bin/bash
  4. if [ "$var" = "abc" ]
  5. then
  6.    echo  " not abc"
  7. else
  8.    echo " abc "
  9. fi

這里本來想判斷var的內(nèi)容是否為abc,實際上var并沒有定義,但是在這里使用并沒有報錯,如果我們想早點發(fā)現(xiàn)這類問題,避免在復雜的腳本中問題被掩蓋,那么可以在開頭加上

 
 
 
  1. set -u

再次運行就會提示:

 
 
 
  1. test.sh: 5: test.sh: num: parameter not set

再想象一下,你本來想刪除:

 
 
 
  1. rm -rf $dir/*

然后dir是空的時候,變成了什么?

是不是有種后背發(fā)涼的感覺?

管道命令一個失敗時整個失敗

有時候我們可能會執(zhí)行類似這樣的命令:

 
 
 
  1. cat test.sh |grep if | cut -d ';' -f 2

三條命令一行執(zhí)行,如果我們希望在其中一條失敗,整個命令就失敗,而避免執(zhí)行后面無意義的命令,那么可以在開始設(shè)置:

 
 
 
  1. set -o pipefail

不設(shè)置的情況下,cat test.sh即使執(zhí)行失敗了,后面的grep實際上還會繼續(xù)執(zhí)行,可能會導致一些意想不到的情況發(fā)生,如果不想這樣的情況發(fā)生,那么這樣設(shè)置是有幫助的。

對于靜態(tài)變量使用readonly

通常我們會在腳本開頭定義一些靜態(tài)變量:

 
 
 
  1. MY_PATH=/usr/bin

而為了避免MY_PATH被意外修改,可以這樣:

 
 
 
  1. readonly MY_PATH=/usr/bin

這樣的話,一旦后面有命令嘗試修改,就會報錯。

 
 
 
  1. #!/bin/bash
  2. readonly MY_PATH=/usr/bin
  3. MY_PATH=/usr/local/bin

運行一下試試:

 
 
 
  1. $ ./test.sh
  2. test.sh: 3: test.sh: MY_PATH: is read only

看,給你提示了!

給變量設(shè)置可選的初始值

例如:

 
 
 
  1. name=${1:-shouwang}
  2. echo "${name}"

這里讓name為$1,即第一個參數(shù),而當它為空時,令name為shouwang。

多條命令執(zhí)行使用&&

例如:

 
 
 
  1. cmd0;cmd1;cmd1

這里如果cmd0失敗了,后面的命令仍然會執(zhí)行,而如果不希望后面的命令執(zhí)行,可以使用:

 
 
 
  1. cmd0 && cmd1 && cmd1

使用函數(shù)

腳本本身比較短還好,而腳本一旦變長,不使用函數(shù),將使得腳本很難維護,可讀性也很差。

總結(jié)

實際上最開始介紹的腳本檢查工具就已經(jīng)非常有效了,基本的錯誤都能檢查出來,而其他的內(nèi)容,更多的是關(guān)注于腳本調(diào)試,不放過任何一個可能的錯誤。

最后,還是優(yōu)先推薦shellcheck工具。地址:https://www.shellcheck.net

作者:守望,linux應(yīng)用開發(fā)者,目前在公眾號【編程珠璣】?分享Linux/C/C++/數(shù)據(jù)結(jié)構(gòu)與算法/工具等原創(chuàng)技術(shù)文章和學習資源。


網(wǎng)頁題目:看完這篇,寫的Shell腳本更加健壯了!
當前鏈接:http://www.5511xx.com/article/dpgehij.html