推薦Bash提高資料 寫出健壯的Bash指令碼

2021-09-01 04:28:12 字數 1757 閱讀 9380

也就是在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修飾函式...