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 资源不可用,Web 服务器会使用与相关 HTTP 状态代码相对应的 HTML 文档(例如 404)进行响应。从 Web 服务器,它显示错误文档并以 0 状态退出以表示成功。
curl
如果检索 HTTP 资源出现问题,我认为您希望返回错误代码。在脚本中,curl
如果检索 HTTP 资源出现问题,最好以不成功的状态退出。为此,您需要提供-f, --fail
curl 选项,在 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 方法,因此不需要。
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)
归档时间: |
|
查看次数: |
47314 次 |
最近记录: |