我有一个在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 ""
}
重复调用此函数,我希望它在第一次失败时退出,此时它不会退出,但会执行其调用的次数,即使它第一次失败。
答案 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
表示:评估a
或b
,||
在逻辑上应用于a
的返回代码,因此如果a
返回{{1}无论如何都会执行0
,not 0
。
b
表示:执行a && b
和a
,b
再次在逻辑上应用于&&
的返回代码,因此如果a
返回{{ 1}}(= false),a
将不会执行,因为评估将在此时停止,但如果0
返回值b
(= true),则评估因此执行将继续。
你还可以使用parantheses(a
和not 0
)和其他东西将它与子shell结合起来构建一些相当复杂的命令链,但我建议你遵循KISS(“保持简单,愚蠢!“)原则如果是shell脚本并且更好地在他们自己的行上编写所有内容,另外注释(使用(
),所以你仍然知道如果你需要在一年后查看脚本会做什么;)
虽然到目前为止我使用过的所有弹壳上的这些东西都是一样的,但仍然存在差异,但如果你像我一样在大多数机器上都有打击,那么这对你来说可能很有趣: