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

Asi*_*sif 9 shell command-substitution exit-status

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

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
Run Code Online (Sandbox Code Playgroud)

当我运行脚本时,返回代码总是$?=0因为脚本成功执行的方式,但我希望返回代码cURL应用于下一个函数。

我已经尝试浏览并在这个站点中使用了几种方法,但没有太大帮助,也许是因为POST命令以及在运行脚本时如何防止输出打印?

谢谢

Ant*_*gan 27

捕获命令的退出状态

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

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

通常,如果请求的 HTTP 资源不可用,Web 服务器会使用与相关 HTTP 状态代码相对应的 HTML 文档(例如 404)进行响应。从 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"
Run Code Online (Sandbox Code Playgroud)

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

(不)打印 curl 命令的输出

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

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

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

httpUrl="http://www.nnin.com"
curl -f -s -d "UID=username&PWD=pass" "$httpUrl"
Run Code Online (Sandbox Code Playgroud)