【问题标题】:How can I branch a shell script based on an HTTP status code from curl?如何根据 curl 的 HTTP 状态代码分支 shell 脚本?
【发布时间】:2012-10-20 02:39:43
【问题描述】:

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

取决于这段代码的结果:

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

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

【问题讨论】:

    标签: bash curl


    【解决方案1】:

    问题

    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 http:// response=$(curl --silent --write-out "\n%{http_code}\n" http://) status_code=$(echo "$response" | sed -n '$p') html=$(echo "$response" | sed '$d') If [ $response == "200" ] then statement 1 statement 2 else echo "Server is not ready" fi 这可以完成这项工作吗?
    【解决方案2】:
    curl -i stackoverflow.com 2>/dev/null | head -n 1 | cut -d\  -f2
    

    【讨论】:

      【解决方案3】:

      我写了一个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}"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-13
        • 2020-04-23
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多