中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何寫出健壯可靠的shell腳本

發布時間:2021-11-02 16:20:40 來源:億速云 閱讀:153 作者:柒染 欄目:系統運維

如何寫出健壯可靠的shell腳本,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

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

語法檢查

第一個最簡單的方法就是利用工具對腳本進行檢查,最大程度地發現shell腳本中存在的語法錯誤,如果你還不知道,建議你絕對不要錯過。

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

腳本失敗時即退出

可以在腳本的開頭設置如下:

set -e

舉個例子:

#!/bin/bashset -elp #這里運行會出錯date

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

$ ./test.shlp: Error - no default destination available.

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

#!/bin/bashset -elp || true date

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

通過set +e設置回來:

set -e#commandset +e#other command

打印腳本執行過程

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

sh -x test.sh

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

//來源:公眾號【編程珠璣】//作者:守望先生#!/bin/bashset -xif [ $# -lt 1 ]then     echo "no para"else     echo "para 1 $1"fi

執行時,輸出如下:

+ [ 0 -le 1 ]+ echo no parano para

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

顯示未定義的變量

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

//來源:公眾號【編程珠璣】//作者:守望先生#!/bin/bashif [ "$var" = "abc" ]then     echo " not abc"else     echo " abc "fi

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

set -u

再次運行就會提示:

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

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

rm -rf $dir/*

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

是不是有種后背發涼的感覺?

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

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

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

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

set -o pipefail

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

對于靜態變量使用readonly

通常我們會在腳本開頭定義一些靜態變量:

MY_PATH=/usr/bin

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

readonly MY_PATH=/usr/bin

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

#!/bin/bashreadonly MY_PATH=/usr/binMY_PATH=/usr/local/bin

運行一下試試:

$ ./test.shtest.sh: 3: test.sh: MY_PATH: is read only

看,給你提示了!

給變量設置可選的初始值

例如:

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

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

多條命令執行使用&&

例如:

cmd0;cmd1;cmd1

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

cmd0 && cmd1 && cmd1

使用函數

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

總結

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

最后,還是優先推薦shellcheck工具。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长寿区| 石楼县| 溆浦县| 年辖:市辖区| 大渡口区| 丰都县| 赞皇县| 于都县| 双鸭山市| 宜川县| 南投县| 富阳市| 柘城县| 安龙县| 隆德县| 湾仔区| 东港市| 三河市| 静海县| 镇沅| 关岭| 灵山县| 富锦市| 宁晋县| 贵德县| 武威市| 祁阳县| 新民市| 铜川市| 汤阴县| 贺兰县| 临泉县| 平塘县| 敦化市| 福海县| 建瓯市| 纳雍县| 佛教| 海宁市| 治县。| 敦煌市|