gpt4 book ai didi

bash - 如何根据来自 curl 的 HTTP 状态代码分支 shell 脚本?

转载 作者:行者123 更新时间:2023-11-29 09:16:27 25 4
gpt4 key购买 nike

我正在为备份编写一个 bash 脚本。该脚本将运行 curl,这将返回特定代码。

根据这段代码的结果:

  • 脚本必须继续运行(如果返回代码正常,比如 200)或
  • 脚本必须返回一个 not ok 状态(如果返回码不是 ok,比如 400)并且结束脚本而不做任何事情

如何从 curl 中读出返回值??对你们大多数人来说都是简单的脚本,但是……;-)

最佳答案

问题

curl 程序是 shell 友好的,这意味着它的退出状态反射(reflect)的是 curl 的状态,而不是 HTTP 状态代码。

解决方案

您可以再次调用 URL 以获取状态代码,使用写出标志将状态代码附加到输出,或解析 header 。以下是一些示例。

第一个选项是幼稚的,因为您正在进行两个单独的调用,因此调用之间的状态代码可能不同。尽管如此,它在某些情况下还是很有用的。

# Make a second call to get the status code.
curl --verbose http://www.google.com 2>&1 |
sed -rn 's!^< HTTP/.* ([[:digit:]]+).*!\1!p'

更好的方法是将状态代码附加到标准输出,然后在捕获后将其删除。例如:

response=$(curl --silent --write-out "\n%{http_code}\n" http://google.com)
status_code=$(echo "$response" | sed -n '$p')
html=$(echo "$response" | sed '$d')

示例输出

使用上面的示例,您可以按照自己喜欢的方式使用这些结果。例如,要分别查看 HTML 和状态代码,您可以这样做:

$ echo "$html"; echo; echo "HTTP Status Code: $status_code"
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

HTTP Status Code: 301

分支

现在您有了状态代码,您可以使用 if/then 或 case 语句根据值进行分支。例如:

case "$status_code" in
200) echo 'Success!'
;;
*) echo 'Fail!'
exit 1
;;
esac

请注意,您必须设置自己的退出状态,并且不能只重复使用 HTTP 状态代码。 shell 退出状态必须在 0-255 之间,许多 HTTP 状态代码都在该范围之外。

另见

关于bash - 如何根据来自 curl 的 HTTP 状态代码分支 shell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11135236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com