bash执行整个脚本,但如果任何中间作业失败,则返回退出码> 0

我有一个bash脚本script.sh如下所示:

 ./step1.sh ./step2.sh ./step3.sh 

每个步骤* .h脚本都会返回正确的错误代码,不pipe它们是否失败。

现在,如果step3.sh失败,我得到一个适当的退出代码,但如果step1.sh或step2.sh失败,step3.sh成功比我得到状态= 0,这是不理想的。

我知道我可以使用

 set -e 

在我的脚本的顶部,如果任何中间步骤失败,脚本就会失败,但这不是我想要的。

我想知道是否有一个简单的选项来执行每个中间脚本(即使其中一个失败),但返回退出代码> 0,如果其中任何一个失败,而不必跟踪每个退出代码手动。

您可以捕获错误:

 #!/bin/bash echo "test start." trap 'rc=$?' ERR ./error.sh ./script2.sh echo "test done." return ${rc} 

有关陷阱如何工作的更多信息,请参阅陷阱 。

你可以这样做:

 #!/bin/bash # array with all the scripts to be executed arr=(./step1.sh ./step2.sh ./step3.sh) # initialize return status to 0 ret=0 # run a loop to execute each script for i in "${arr[@]}"; do echo "running $i" bash "$i" ret=$((ret | $?)) # return status from previous step bitwise OR with current status done echo "exiting with status: $ret" exit $ret 

我知道你说过你不想维护每一个退出代码,但是这对于数组来说确实很简单:

 declare -a rcs ./step1.sh ; rcs+=($?) ./step2.sh ; rcs+=($?) ./step3.sh ; rcs+=($?) 

然后你可以简单地循环访问数组,寻找第一个(或最大的,最后的,平均的,总和等)的错误代码,如你所愿。 下面的代码显示了如何做到这一点,以返回遇到的第一个错误:

 for ((idx = 0; idx < ${#rcs[@]}; idx++)); do [[ ${rcs[$idx]} -ne 0 ]] && return ${rcs[$idx]} done return 0 

同样,要得到最大的错误:

 rc=0 for ((idx = 0; idx < ${#rcs[@]}; idx++)); do [[ ${rcs[$idx]} -gt $rc ]] && rc=${rcs[$idx]} done return $rc 

归功于绝对的基础知识,

 rc=0 ./step1 || rc=$? ./step2 || rc=$? ./step3 || rc=$? exit $rc