如何寫出健壯可靠的shell指令碼

2022-05-01 11:18:08 字數 2561 閱讀 8147

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

#!/bin/bash

set -e

lp || true

#命令執行失敗,繼續執行

date

[root@dg1 opt]#

sh t1.sh

t1.sh: line 3: lp: command not found

mon aug 24 10:14:18 cst 2020

2 列印指令碼執行過程

sh -x test.sh #整個過程執行了哪些命令

或者在開頭加上set -x

[root@dg1 opt]#

cat t2.sh

#!/bin/bash

set -x

if [ $#

-lt 1 ]

then

echo

"no para

"else

echo

"para 1 $1"fi

[root@dg1 opt]#

./t2.sh 2

++ '[' 1 -lt 1']'

++ echo 'para 1 2'

para 1 2[root@dg1 opt]#

./t2.sh

++ '[' 0 -lt 1']'

++echo 'no para'

no para

3 顯示未定義的變數:

shell中變數沒有定義,仍然是可以使用的,但是它的結果可能不是你所預期的

#

!/bin/bash

if [ "

$var

" = "

abc"

]then

echo

"not abc

"else

echo

"abc "fi

這裡本來想判斷var的內容是否為abc,實際上var並沒有定義,但是在這裡使用並沒有報錯,在開頭加上set -u

[root@dg1 opt]#

cat t3.sh

#!/bin/bash

set -u

if [ "

$var

" = "

abc"

]then

echo

"not abc

"else

echo

"abc "f

[root@dg1 opt]#

./t3.sh

./t3.sh: line 3: var: unbound variable

4 管道命令乙個失敗時整個失敗

例如一條命令:cat test.sh |grep if | cut -d ';' -f 2三條命令一行執行,如果我們希望在其中一條失敗,整個命令就失敗,而避免執行後面無意義的命令,可以在開頭加上set -o pipefail

[root@dg1 opt]#

cat t3.sh |grep if |cut -d '=' -f 1

if [ "

$var

"[root@dg1 opt]#

cat t3.sh |grep if |cut -d '=' -f 2

"abc"]

[root@dg1 opt]#

cat t3.sh |grep if |cut -d '=' -f 3

[root@dg1 opt]#

cat t3.sh |grep if

if [ "

$var

" = "

abc" ]

5 對於靜態變數使用 readonly

通常我們會在指令碼開頭定義一些靜態變數:

my_path=/usr/bin

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

readonly my_path=/usr/bin

6 給變數設定可選的初始值

name=$

echo "$

"這裡讓name為

$1,即第乙個引數,而當它為空時,令name為 yang

7 多條命令執行使用&&

例如 cmd0;cmd1;cmd2

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

cmd0 && cmd1 && cmd2

8 使用函式

如果指令碼比較長,建議使用函式,便於維護,可讀性也比較高

9 可以使用 shellcheck 指令碼檢查工具

參考:

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

也就是在bash中使用防禦性程式設計。什麼是防禦性程式設計?寫道 什麼是防禦性程式設計?顧名思義,防禦性程式設計是一種細緻 謹慎的程式設計方法。為了開發可靠的軟體,我們要設計系統中的每個元件,以使其盡可能地 保護 自己。我們通過明確地在 中對設想進行檢查,擊碎了未記錄下來的設想。這是一種努力,防止 ...

如何寫出健壯的JAVA程式的一些心得。

在我們的程式中,儘管我們的程式流程可能都是正確的,但仍然可能受一些外界因素的影響而出現意外導致程式未按預期流程執行。下面我就談談工作中遇到的一些意外 1.在web程式中,引數由前台傳遞給伺服器,雖然雙方已經明確規定了傳遞的引數個數和型別,但如果前台的引數生成依賴於其他的 那麼如果其他 出現問題導致引...

如何寫出最快的迴圈

作者 laruence 你知道怎麼寫出最快的迴圈麼?剛剛在曉東郭的 blog 看到乙個有趣的問題 php 中 i 和 i 的區別 1.方式一 2.3.begin time 4.i 0 5.while i 10000 6.12.end time 13.14.時間 16s 15.16.方式二 17.18...