命令替换中使用的curl的返回代码

命令替换中使用的curl的返回代码

我的脚本如下:-(已编辑)

httpUrl="http://www.nnin.com"
rep=$(curl -v -X POST -d "UID=username&PWD=pass" $httpUrl)

status=$? 

if [ "$?" -eq 0 ]; then

    echo "Success"
    exit $status
  else
    echo "Failed"
    exit $status
fi

当我运行脚本时,返回代码总是$?=0因为在某种程度上脚本已成功执行,但我希望返回代码应用于cURL下一个函数。

我尝试浏览并特别使用此站点中的几种方法,但没有多大帮助,可能是因为命令POST以及如何在运行脚本时防止打印输出?

谢谢

答案1

捕获命令的退出状态

将命令输出赋值给rep变量不会丢失curl命令的退出状态;它仍然可以作为$?.有关更多详细信息,请参阅如何将命令的返回值和/或输出存储在变量中?

失败的 HTTP 请求的 Curl 退出代码

通常,如果请求的 HTTP 资源不可用,Web 服务器会使用与相关 HTTP 状态代码(例如 404)相对应的 HTML 文档进行响应。在这种情况下,curl 会从服务器接受此文档,因为它已成功获取响应从 Web 服务器,它显示错误文档并以状态 0 退出表示成功。

curl我认为如果检索 HTTP 资源时出现问题,您希望返回错误代码。在脚本中curl,如果检索 HTTP 资源出现问题,最好以不成功状态退出。为此,您需要提供-f, --failcurl选项,在curl手册页中描述为:

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

此方法不是自动防故障的,有时会漏掉不成功的响应代码,特别是在涉及身份验证时(响应代码 401 和 407)。

您可以使用额外的变量来保存curl命令的退出状态status

httpUrl="http://www.nnin.com"
rep=$(curl -f -v -d "UID=username&PWD=pass" "$httpUrl")
status="$?"
echo "$rep"
exit "$status"

shell 变量httpUrl应该用双引号引起来,以防 URL 包含可由 shell 解释的字符。此外,-X POST也不需要,因为当随选项提供数据时始终使用 POST 方法-d

(不)打印curl命令的输出

rep如果您所做的只是将curl 命令的输出打印到标准输出,则无需将其保存到变量中。

关于第二个问题,“如何防止打印输出”,您可以将-v/--verbose选项替换为-s/--silent选项(静音模式。不显示进度表或错误消息)

事实上,如果脚本的最后一个命令是curl 调用,您可以进一步简化脚本。脚本的退出代码将是脚本最后一个命令的返回代码。

httpUrl="http://www.nnin.com"
curl -f -s -d "UID=username&PWD=pass" "$httpUrl"

相关内容