2013-04-18 78 views
22

我有一個bash腳本,用於按順序執行多個命令,如果至少有一個命令在該序列返回非零退出代碼。我知道有一個wait命令,但我不確定我知道如何使用它。按順序在bash腳本中執行多個命令,如果其中至少有一個失敗,則失敗

UPD腳本是這樣的:在前臺運行

#!/bin/bash 
command1 
command2 
command3 

所有的命令。所有命令都需要運行,而不管前一個命令返回的退出狀態是什麼(所以它不能像第一個錯誤時退出)。基本上我需要收集所有退出狀態並相應地返回全局退出狀態。

+0

也許這是http://stackoverflow.com/questions/3474526/stop-on-first-error是你想要的? –

+0

@Marian Theisen不,腳本不能停在第一個錯誤。無論前一個命令返回的狀態如何,腳本中的所有命令都需要運行。 –

回答

28

只要做到這一點:

EXIT_STATUS=0 
command1 || EXIT_STATUS=$? 
command2 || EXIT_STATUS=$? 
command3 || EXIT_STATUS=$? 
exit $EXIT_STATUS 

不知道該狀態的它應該返回如果幾個命令都失敗了。

+1

如果您想在第一個錯誤後停止,您可以使用「set -e」 – mcoolive

7

如果按順序表示管道,那麼您需要在set -o pipefail等腳本中設置pipefail。從man bash

管道的返回狀態是最後一個命令的退出狀態, 除非pipefail選項啓用 。如果啓用了pipefail,則管道的返回狀態是以非零狀態退出的最後(最右邊) 命令的值,如果所有命令均成功退出,則爲零。如果保留 一詞!在流水線之前,該流水線的退出狀態是如上所述的退出 狀態的邏輯否定。在等待 返回值之前,shell等待管道中的所有命令終止。

如果您只是表示順序命令,那麼只需檢查每個命令的退出狀態並設置一個標誌,如果退出狀態爲非零。讓你的腳本返回標誌的值,如:

#!/bin/bash 

EXIT=0 
grep -q A <<< 'ABC' || EXIT=$? # Will exit with 0 
grep -q a <<< 'ABC' || EXIT=$? # Will exit with 1 
grep -q A <<< 'ABC' || EXIT=$? # Will exit with 0 
echo $EXIT      # Will print 1 
exit $EXIT      # Exit status of script will be 1 

這將使用邏輯運算符OR ||僅如果命令失敗,設置EXIT。如果多個命令失敗,那麼腳本會返回上一個失敗命令的退出狀態。

如果這些命令沒有在後臺運行,則wait與此處不相關。

4

如果你想知道哪些命令失敗,但不neccessarily它的返回碼,你可以使用:

#!/bin/bash 

rc=0; 
counter=0; 

command1 || let "rc += 1 << $counter"; let counter+=1; 
command2 || let "rc += 1 << $counter"; let counter+=1; 
command3 || let "rc += 1 << $counter"; let counter+=1; 

exit $rc 

它使用位在bash轉移,以設置對應於命令失敗位。

因此,如果第一個命令失敗,您將得到1(= 2^0)的返回碼,如果第三個失敗,您將得到8(= 2^3)的返回碼,並且如果第一個第三個命令失敗,你會得到9作爲返回碼。

相關問題