也就是在bash中使用防禦性程式設計。
什麼是防禦性程式設計? 寫道
什麼是防禦性程式設計?
顧名思義,防禦性程式設計是一種細緻、謹慎的程式設計方法。為了開發可靠的軟體,我們要設計系統中的每個元件,以使其盡可能地"保護"自己。我們通過明確地在**中對設想進行檢查,擊碎了未記錄下來的設想。這是一種努力,防止(或至少是觀察)我們的**以將會展現錯誤行為的方式被呼叫。
對沒有初始化的變數做替換時,報錯退出。
help set 寫道
-u treat unset variables as an error when substituting.
-o option-name
nounset same as -u
如果執行命令的退出碼不是0時,指令碼立即退出。這樣可以避免某些程式片段沒有做錯誤檢查而導致不可預期的結果。
help set 寫道
-e exit immediately if a command exits with a non-zero status.
-o option-name
errexit same as -e
對於引用變數,最好寫在雙引號中,而不是讓它裸奔
因為var變數的值中包含空白時,就有可能造成程式出錯
因為如果某個引數中包含空白時,不加引號的$@會有問題,含空格的引數將會**成多個
在編寫c**時通常會在程式開始時使用signal()設定訊號處理函式,使程式更加健壯。
在bash中,可以使用 trap 對訊號處理,比如刪除臨時檔案、殺死程序等。
trap command signal [signal ...]
help set 寫道
-c if set, disallow existing regular files to be overwritten
by redirection of output.
-o option-name
noclobber same as -c
使用檔案鎖的情況,最好如下處理,以避免競態條件:
if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null; then要麼全部做,要麼什麼都不做。trap 'rm -f "$lockfile"; exit $?' int term exit
#critical-section
rm -f "$lockfile"
trap - int term exit
else
echo "failed to acquire lockfile: $lockfile"
echo "held by $(cat $lockfile)"
fi
比如:下面的**展示的將檔案中的乙個字串替換成另乙個字串,保證所有檔案都被替換,或者都不被替換。
思路是先把要處理的檔案複製到乙個臨時目錄,進行替換操作,然後再替換原來的。即使 ctrl+c 終止,也不會出現部分被替換的情況。
mv /var/www-tmp /var/www更詳細的內容,請參看
如何寫出健壯可靠的shell指令碼
1 指令碼失敗時即退出 set e 例子 bin bash set e lp 這裡執行會出錯 date root dg1 opt sh t1.sh t1.sh line 3 lp command not found 可以在指令碼的開頭設定如下 set e root dg1 opt vim t1.sh...
使用const 提高函式的健壯性
1,用const修飾函式的引數 1.1如果此引數是作輸出用,則不論它是什麼資料型別,也不論它採用 指標傳遞 或 引用傳遞 都不能加const修飾,否則該將失去輸出功能。如果此引數是作輸入用,則用const 修飾可以防止意外地改動該指標,採用規則 常量指標,或指標常量而定 如果直接採用值傳遞的話 則不...
使用const提高函式的健壯性
const不僅是用來定義const常量 更大的作用是修飾函式的引數 返回值 函式的定義體 const是constant的縮寫,恆定不變的意思。被const修飾的東西都受到強制保護,可以預防意外的變動,提高程式的健壯性。so use const whenever you need.用const修飾函式...