如何检查诸如curl之类的命令是否完成而没有错误?

如何检查诸如curl之类的命令是否完成而没有错误?

我正在使用curl 通过 HTTP post 将文件上传到服务器。

curl -X POST [email protected] server-URL

当我在命令行上手动执行此命令时,我收到来自服务器的响应,例如"Upload successful".但是,如果我想通过脚本执行这个curl命令,我怎样才能知道我的POST请求是否成功呢?

答案1

您也许可以使用curl's --fail选项,但您应该先测试一次。

man curl

-f, --fail (HTTP) 在服务器出现错误时静默失败(根本没有输出)。这样做主要是为了更好地启用脚本等来更好地处理失败的尝试。在正常情况下,当 HTTP 服务器无法传递文档时,它会返回一个 HTML 文档来说明情况(通常还描述了原因及更多信息)。该标志将阻止curl输出该信息并返回错误22。

          This method is not fail-safe and there are occasions where  non-
          successful  response  codes  will  slip through, especially when
          authentication is involved (response codes 401 and 407).

这样你就可以这样做:

args="-X POST [email protected] server-URL"
curl -f $args && echo "SUCCESS!" ||
    echo "OH NO!"

答案2

最简单的方法是存储响应并进行比较:

$ response=$(curl -X POST [email protected] server-URL);
$ if [ "Upload successful" == "${response}" ]; then … fi;

我还没有测试过。语法可能有问题,但这就是想法。我确信有更复杂的方法可以做到这一点,例如检查curl的退出代码或其他东西。

更新

curl返回相当多的退出代码。我猜测失败的帖子可能会导致因此您可以通过与( )55 Failed sending network data.进行比较来确保退出代码为零:$?Expands to the exit status of the most recently executed foreground pipeline.

$ curl -X POST [email protected] server-URL;
$ if [ 0 -eq $? ]; then … fi;

或者,如果您的命令相对较短,并且您想在失败时执行某些操作,则可以依赖退出代码作为条件语句中的条件:

$ if curl --fail -X POST [email protected] server-URL; then
    # …(success)
else
    # …(failure)
fi;

我觉得这个格式通常是首选,但我个人觉得它的可读性较差。

相关内容