问题陈述: -
我有四个shell脚本,只有在前一个脚本成功执行后才能执行。我现在正在运行它 -
./verify-export-realtime.sh
sh -x lca_query.sh
sh -x liv_query.sh
sh -x lqu_query.sh
因此,为了使其他脚本在上一个脚本成功之后运行。我需要做类似下面的事情吗?我不确定我是对的吗?如果任何脚本由于任何原因而失败,它将打印为由于某种原因失败对吗?
./verify-export-realtime.sh
RET_VAL_STATUS=$?
echo $RET_VAL_STATUS
if [ $RET_VAL_STATUS -ne 0 ]; then
echo "Failed due to some reason"
exit
fi
sh -x lca_query.sh
RET_VAL_STATUS=$?
echo $RET_VAL_STATUS
if [ $RET_VAL_STATUS -ne 0 ]; then
echo "Failed due to some reason"
exit
fi
sh -x liv_query.sh
RET_VAL_STATUS=$?
echo $RET_VAL_STATUS
if [ $RET_VAL_STATUS -ne 0 ]; then
echo "Failed due to some reason"
exit
fi
sh -x lqu_query.sh
答案 0 :(得分:5)
shell提供了一个操作符&&
来完成这个操作。所以你可以写:
./verify-export-realtime.sh && \
sh -x lca_query.sh && \
sh -x liv_query.sh && \
sh -x lqu_query.sh
或者你可以摆脱续行(\
)并将其全部写在一行
./verify-export-realtime.sh && sh -x lca_query.sh && sh -x liv_query.sh && sh -x lqu_query.sh
如果您想知道它有多远,您可以添加仅设置变量的额外命令:
done=0
./verify-export-realtime.sh && done=1 &&
sh -x lca_query.sh && done=2 &&
sh -x liv_query.sh && done=3 &&
sh -x lqu_query.sh && done=4
最后$done
的值告诉您成功完成了多少命令。 $?
将设置为上次命令运行的退出值(失败的那个),或0
如果全部成功
答案 1 :(得分:1)
您可以在命令行(或其他脚本)中运行一系列脚本,当第一个失败命令将使用“&&”打破此链时操作者:
$ script1.sh && echo "First done, running the second" && script2.sh && echo "Second done, running the third" && script3.sh && echo "Third done, cool!"
等等。一旦其中一个步骤失败,操作就会中断。
答案 2 :(得分:0)
那应该是对的。如有必要,您还可以通过回显$变量来打印错误代码。您还可以通过在这些脚本中实际返回自己的值并在此主脚本中检查它们来创建自己的返回值代码。它可能更有帮助“脚本由于某种原因失败了。”
答案 3 :(得分:0)
如果您想要更灵活的处理错误
script1.sh
rc=$?
if [ ${rc} -eq 0 ];then
echo "script1 pass, starting script2"
script2.sh
rc=$?
if [ ${rc} -eq 0 ];then
echo "script2 pass"
else
echo "script2 failed"
fi
else
echo "script1 failed"
fi
答案 4 :(得分:0)
执行此操作的标准方法是简单地添加一个shell选项,如果任何简单命令失败,则会导致脚本中止。只需将解释器行写为:
#!/bin/sh -e
或添加命令:
set -e
(如其他解决方案中所述,cmd1 && cmd2 && cmd3
也很常见。)
绝对不应该尝试打印错误消息。如果遇到错误,该命令应在退出之前打印相关的错误消息。如果命令表现不佳并且没有编写有用的错误消息,则应该修复它们而不是试图猜测它们遇到的错误。如果您确实编写了错误消息,请至少将其写入正确的位置。错误属于stderr:
echo "Some error occurred" >&2
答案 5 :(得分:0)
正如@William Pursell所说,你的脚本真的应该报告自己的错误。如果您还需要在调用脚本中报告错误,最简单的方法就是这样:
if ! ./verify-export-realtime.sh; then
echo "Error running verify-export-realtime.sh; rest of script cancelled." >&2
elif ! sh -x lca_query.sh; then
echo "Error running lca_query.sh; rest of script cancelled." >&2
elif ! sh -x liv_query.sh; then
echo "Error running liv_query.sh; rest of script cancelled." >&2
elif ! sh -x lqu_query.sh; then
echo "Error running lqu_query.sh." >&2
fi