按顺序在bash脚本中执行多个命令,如果其中至少有一个失败,则失败

问题描述:

我有一个bash脚本,用于按顺序执行多个命令,如果至少有一个命令在该序列返回非零退出代码。我知道有一个wait命令,但我不确定我知道如何使用它。按顺序在bash脚本中执行多个命令,如果其中至少有一个失败,则失败

UPD脚本是这样的:在前台运行

#!/bin/bash 
command1 
command2 
command3 

所有的命令。所有命令都需要运行,而不管前一个命令返回的退出状态是什么(所以它不能像第一个错误时退出)。基本上我需要收集所有退出状态并相应地返回全局退出状态。

+0

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

+0

@Marian Theisen不,脚本不能停在第一个错误。无论前一个命令返回的状态如何,脚本中的所有命令都需要运行。 –

只要做到这一点:

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

不知道该状态的它应该返回如果几个命令都失败了。

+1

如果您想在第一个错误后停止,您可以使用“set -e” – mcoolive

如果按顺序表示管道,那么您需要在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与此处不相关。

如果你想知道哪些命令失败,但不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作为返回码。