如何在CURL的shell脚本中捕获超时/错误?

11
我想向一个URL发出cURL GET请求,并根据返回的HTTP代码决定是否对返回的HTTP数据进行操作。
例如,如果通过cURL进行的某个url请求的HTTP代码是有效的(未超时或错误),则将请求返回的数据保存在我的系统中的某个地方。
我该如何实际“捕获”返回的HTTP代码(或超时)并基于此做出决策?

这个答案与编写Shell脚本来确定网页是否存在密切相关... - user000001
2个回答

36
执行以下命令:script.sh http://www.google.com/
-D - 将头文件转储到文件中
-o - 将响应写入文件
-s - 保持静默
-w - 显示指定变量的值
#!/bin/bash

RESPONSE=response.txt
HEADERS=headers.txt

status=$(curl -s -w %{http_code} $1 -o $RESPONSE)

# or
#curl -s -D $HEADERS $1 -o $RESPONSE
#status=$(cat $HEADERS | head -n 1 | awk '{print $2}')

echo $status

使用$status$RESPONSE进行进一步处理。


10
+1 表示支持包含 CLI 选项的解释。它们在 man 手册中,但如果海报能花点小工夫将这一层额外的抽象去掉,那就更易懂了。希望更多人这样做。 - L0j1k
百分号符号(%)是Windows特有的吗? - user1663023
1
@ElgsQianChen 百分号符号不是Windows特有的。对于curl命令中可用于-w选项的预定义变量,使用%{variable_name}格式进行传递。为了在Windows上运行,必须手动转义百分号符号。从curl手册中可以看到:“注意:在win32环境中,百分号符号(%)是一个特殊符号,使用此选项时,所有出现的%都必须加倍。” - Sithsu

0
如果你想将HTTP响应存储到一个变量中。
#!bin/bash

STATUS_RECEIVED=$(curl -s --write-out "%{http_code}\n" $envUrl --output output.txt --silent) ;

echo $STATUS_RECEIVED


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接