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

时间:2012-06-21 09:26:22

标签: bash curl

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

取决于此代码的结果:

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

如何从卷曲中读出回报? 大多数人的简单脚本,但......; - )

3 个答案:

答案 0 :(得分:9)

问题

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状态代码都在该范围之外。

另请参阅

答案 1 :(得分:3)

curl -i stackoverflow.com 2>/dev/null | head -n 1 | cut -d\  -f2

答案 2 :(得分: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}"