Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何根据curl中的HTTP状态代码来分支shell脚本?_Bash_Curl - Fatal编程技术网

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

Bash 如何根据curl中的HTTP状态代码来分支shell脚本?,bash,curl,Bash,Curl,我正在为备份编写bash脚本。 脚本将运行一个curl,这将返回一个特定的代码 根据此代码的结果: 脚本必须继续运行(如果返回代码正常,如200) 或 脚本必须返回not ok状态(如果返回代码为not ok,如400),并在不执行任何操作的情况下结束脚本 如何从卷曲中读出返回值?? 对你们大多数人来说都很简单,但是…;-) 我写了一个演示,它可以打印状态代码。:) 问题 curl程序是shell友好的,这意味着它的退出状态反映了curl的状态,而不是HTTP状态代码 解决方案 您可以第二次

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

根据此代码的结果:

  • 脚本必须继续运行(如果返回代码正常,如200) 或
  • 脚本必须返回not ok状态(如果返回代码为not ok,如400),并在不执行任何操作的情况下结束脚本
如何从卷曲中读出返回值??
对你们大多数人来说都很简单,但是…;-)

我写了一个演示,它可以打印状态代码。:)

问题 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'
样本输出 使用上面的示例,您可以任意使用这些结果。例如,要分别查看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
请注意,您必须设置自己的退出状态,并且不能仅重复使用HTTP状态代码。外壳程序退出状态必须介于0-255之间,并且许多HTTP状态代码超出该范围

另见

如果我理解正确:curl http://response=$(curl--silent--write“\n%{http\u code}\n”http://)status\u code=$(echo“$response”| sed-n'$p')html=$(echo“$response”| sed')如果[$response==“200”],那么语句1语句2 else echo“服务器未准备就绪”fi这能完成任务吗?
response=$(curl --silent --write-out "\n%{http_code}\n" http://google.com)
status_code=$(echo "$response" | sed -n '$p')
html=$(echo "$response" | sed '$d')
$ 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
case "$status_code" in
    200) echo 'Success!'
         ;;
      *) echo 'Fail!'
         exit 1
         ;;
esac
curl -i stackoverflow.com 2>/dev/null | head -n 1 | cut -d\  -f2