【发布时间】:2012-10-20 02:39:43
【问题描述】:
我正在编写一个用于备份的 bash 脚本。 脚本将运行 curl,这将返回特定代码。
取决于这段代码的结果:
- 脚本必须继续运行(如果返回码没问题,比如200) 或
- 脚本必须返回一个不正常的状态(如果返回码不正常,比如 400)并且不做任何事情就结束脚本
如何从 curl 中读取返回值? 对你们大多数人来说都是简单的脚本,但是... ;-)
【问题讨论】:
我正在编写一个用于备份的 bash 脚本。 脚本将运行 curl,这将返回特定代码。
取决于这段代码的结果:
如何从 curl 中读取返回值? 对你们大多数人来说都是简单的脚本,但是... ;-)
【问题讨论】:
curl 程序是 shell 友好的,这意味着它的退出状态反映了 curl 的状态,而不是 HTTP 状态码。
您可以对 URL 进行第二次调用以获取状态代码,使用 write-out 标志将状态代码附加到您的输出中,或解析标头。以下是一些示例。
第一个选项是幼稚的,因为您正在进行两个单独的调用,因此调用之间的状态代码可能不同。不过,它在某些情况下可能很有用。
# 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 状态代码超出了该范围。
【讨论】:
curl -i stackoverflow.com 2>/dev/null | head -n 1 | cut -d\ -f2
【讨论】:
我写了一个demo,可以打印状态码。 :)
#!/bin/bash
status_line=`curl -i stackoverflow.com 2>/dev/null | head -n 1`
status_code=`echo $status_line | awk '{print $2}'`
echo "STATUS_CODE: ${status_code}"
【讨论】: