2010-07-10 110 views
0

我想對腳本中調用的每個函數進行驗證,並在一個函數失敗時將整個腳本錯誤地排除。Bash腳本函數驗證

尋找最好的方法來做到這一點。我覺得我知道一次很好的做法,但不能再搞清楚。

我可以暴力,但它是討厭的。這是我如何能得到它的正常工作

copy_files $1 
    if [ "$?" -ne "0" ]; then 
      error "Copying files" 
      return -1 
    fi 

這變得很醜陋,因爲我有一個腳本,雲:

命令1 命令2 命令3

有包裹與回報所有這些命令不是很理想。 :(請幫助!

回答

3
command1 || (error "Cmd1 fail"; return -1); command2 || (error "Cmd2 fail"; return -1); 

等等等等。||運營商表示,如果前一個命令失敗的下一個命令將只執行。&&是相反的。括號組的命令來運行。

+0

+ 1代表'||',但我建議將'return -1'改爲'exit 1'(1是錯誤代碼的標準選擇)。這可以讓你定義一個名爲'die'的函數來處理退出的部分,然後你可以寫'command1 || die'和'command2 ||死亡「等。這是一個相當普遍的做法。 – 2010-07-10 23:18:27

+0

我喜歡這個......但是我正在運行我的腳本。 ./myscript.sh。如果我在死亡的時候出口1,它會殺死我的整個航站樓。有關如何退出腳本而不會從腳本中終止我的終端的任何想法? – 2010-07-10 23:56:05

0

你可以做這樣的事情:

good() { 
    return 0; 
} 

bad() { 
    return 5; 
} 

wrapper() { 
    $1 

    rc=$? 

    if [ "$rc" -ne "0" ]; then 
      echo "error: $1 returned $rc" 
      exit -1 
    fi 
} 


wrapper bad 
wrapper good 

,或者,如果你可以傳遞的功能列表,像這樣:

wrapper() { 
    for f in $*; do 

     $f 
     rc=$? 

     if [ "$rc" -ne "0" ]; then 
       echo "error: $f returned ${rc}" 
       return -1 
     fi 
    done 
    return 0; 
} 


wrapper good bad 

if [ "$?" -ne "0" ]; then 
    #error handling here 
    exit -1; 
fi 
1

既然你說你想在一個腳本每一個命令做到這一點,你可以在開頭插入

set -e 

。如果任何命令返回0以外的狀態碼,該調用立即退出。(例外:作爲條件語句中測試的一部分的命令,以及後面跟着&&||或其他命令的命令)

+0

如果你這樣做,考慮設置PS4更好的跟蹤。導出PS4 ='+ $ {BASH_SOURCE}:$ {LINENO}:$ {FUNCNAME [0]}:'。根據http://aymanh.com/how-debug-bash-scripts – 2010-08-13 21:40:37