4

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

根据此代码的结果:

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

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

4

3 回答 3

10

问题

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 状态代码超出该范围。

也可以看看

于 2012-06-21T10:22:51.050 回答
3
curl -i stackoverflow.com 2>/dev/null | head -n 1 | cut -d\  -f2
于 2012-10-19T18:36:51.003 回答
1

我写了一个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}"
于 2012-06-21T09:37:30.773 回答