Bash:如何检查一些操作是否成功完成?

时间:2014-02-10 11:13:45

标签: bash shell

我有一个bash脚本可以执行各种操作,例如脚本:

scp $workdir/$site$dom.conf root@$srv13:$workdir
  scp $workdir/$site$dom.conf root@$srv179:$workdir
  ssh root@$srv13 "hostname ; service httpd restart"
  ssh root@localhost "hostname ; service httpd restart"
  ssh root@$srv179 "hostname ; service httpd restart"
  ssh root@$srv201 "hostname ; service named restart"

我想返回一些“操作成功”指示,但我想确保所有操作都成功完成。 通常我会使用if [ $? = 0 ]; then...,但我想知道是否还有其他方法可以做到这一点,因为编写5x if's似乎不会采用“最少行政努力”的方式。 那么,还有另一种批量检查这5个操作的退出代码的方法吗?

2 个答案:

答案 0 :(得分:3)

如果您在任何操作失败时需要失败,那么只需在脚本顶部执行set -e即可。一旦步骤失败,它就会失败。

如果您对任何单独的步骤失败感到满意,但只想跟踪失败次数,那么您可以试试这个:

success_count=0
scp $workdir/$site$dom.conf root@$srv13:$workdir && success_count=$((success_count+1))
scp $workdir/$site$dom.conf root@$srv179:$workdir && success_count=$((success_count+1))
ssh root@$srv13 "hostname ; service httpd restart" && success_count=$((success_count+1))
ssh root@localhost "hostname ; service httpd restart" && success_count=$((success_count+1))
ssh root@$srv179 "hostname ; service httpd restart" && success_count=$((success_count+1))
ssh root@$srv201 "hostname ; service named restart" && success_count=$((success_count+1))

echo "Num ops succeeded = $success_count"

您甚至可以将其拉入一个功能,例如:

exec_with_count() {
    "$@" && success_count=$((success_count+1))
}

exec_with_count scp $workdir/$site$dom.conf root@$srv13:$workdir
exec_with_count scp $workdir/$site$dom.conf root@$srv179:$workdir
...

echo "Num ops succeeded = $success_count"

答案 1 :(得分:3)

您可以使用&&对操作进行链接,但也许您已经将其排除在外?

scp $workdir/$site$dom.conf root@$srv13:$workdir &&
  scp $workdir/$site$dom.conf root@$srv179:$workdir &&
  ssh root@$srv13 "hostname service httpd restart" &&
  ssh root@localhost "hostname  service httpd restart" &&
  ssh root@$srv179 "hostname service httpd restart" &&
  ssh root@$srv201 "hostname service named restart" &&
  echo "All ok"