按顺序在bash脚本中执行多个命令,如果其中至少有一个失败,则失败
我有一个bash脚本,用于按顺序执行多个命令,如果至少有一个命令在该序列返回非零退出代码。我知道有一个wait
命令,但我不确定我知道如何使用它。按顺序在bash脚本中执行多个命令,如果其中至少有一个失败,则失败
UPD脚本是这样的:在前台运行
#!/bin/bash
command1
command2
command3
所有的命令。所有命令都需要运行,而不管前一个命令返回的退出状态是什么(所以它不能像第一个错误时退出)。基本上我需要收集所有退出状态并相应地返回全局退出状态。
只要做到这一点:
EXIT_STATUS=0
command1 || EXIT_STATUS=$?
command2 || EXIT_STATUS=$?
command3 || EXIT_STATUS=$?
exit $EXIT_STATUS
不知道该状态的它应该返回如果几个命令都失败了。
如果您想在第一个错误后停止,您可以使用“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作为返回码。
也许这是http://stackoverflow.com/questions/3474526/stop-on-first-error是你想要的? –
@Marian Theisen不,脚本不能停在第一个错误。无论前一个命令返回的状态如何,脚本中的所有命令都需要运行。 –