如何使shell脚本在执行失败时失败?

时间:2014-03-20 16:29:00

标签: shell scripting

我有一个在CI服务器上执行的shell脚本,shell脚本执行Curl的耦合。 现在我希望脚本失败,如果curl不成功,我读到" $?"将给出执行的语句的状态,我如何使用它来实现我想要的?

function do_curl 
    {
      echo "==== Posting $file_name to DHIS ===="
      curl -H "Content-Type: application/json" -u $authorization -d @$file_name $url -X POST || exit
      echo ""
    }

重复调用此函数,我希望它在第一次失败时退出,此时它不会退出,但会执行其调用的次数,即使它第一次失败。

2 个答案:

答案 0 :(得分:2)

curl --fail ... || exit

...如果卷曲调用失败,将立即退出带有curl退出状态的shell脚本。

也可以通过set -e在全球范围内获得失败退出行为,但这只能由专家来完成;请参阅http://mywiki.wooledge.org/BashFAQ/105,了解其局限性和陷阱。

答案 1 :(得分:2)

更新

对于使用函数的问题的可能答案(原始问题没有函数),请参见此处:Is there a way to write a bash function which aborts the whole execution, no matter how it is called?

(您还可以进一步更新您的问题以获得更好的答案)


一种可能的解决方案是为每一行使用类似的东西:

curl ... || exit

当然,如果你有多个网址,你可以将它封装在一个函数中,或者你可以用这种方式链接它们:

curl ... && curl ... && ...

您也可以使用\打破当前行,如下所示:

curl ... && \
curl ... && \
...

这也有效,因为没有显式exit语句的脚本应该返回最后设置的退出代码,例如在这种情况下由最后执行的curl命令返回的那个。


关于使用过的运算符:

a || b 

表示:评估ab||在逻辑上应用于a的返回代码,因此如果a返回{{1}无论如何都会执行0not 0

b

表示:执行a && b ab再次在逻辑上应用于&&的返回代码,因此如果a返回{{ 1}}(= false),a将不会执行,因为评估将在此时停止,但如果0返回值b(= true),则评估因此执行将继续。

你还可以使用parantheses(anot 0)和其他东西将它与子shell结合起来构建一些相当复杂的命令链,但我建议你遵循KISS(“保持简单,愚蠢!“)原则如果是shell脚本并且更好地在他们自己的行上编写所有内容,另外注释(使用(),所以你仍然知道如果你需要在一年后查看脚本会做什么;)

虽然到目前为止我使用过的所有弹壳上的这些东西都是一样的,但仍然存在差异,但如果你像我一样在大多数机器上都有打击,那么这对你来说可能很有趣:

Bash Reference Manual