使用curl格式输出时,如何判断curl请求是否失败
解决Curl请求失败仍输出耗时的问题
首先得明确:你用的-f参数是关键——它会让Curl在返回HTTP 4xx/5xx状态码(比如文件不存在的404)时,返回非0的退出码,这是判断请求是否成功(是否下载到文件)最可靠的依据,比看输出内容准确得多。
现在问题是不管成功失败,-w指定的耗时格式都会输出,我们需要把耗时输出和成功状态绑定,只在成功时展示耗时信息。
具体解决方案
方案1:用临时文件控制耗时输出
通过临时文件存储耗时数据,只有当Curl执行成功时才读取并打印:
# 定义你的变量 IP_PORT="your-server-ip:port" FILE_NAME="target-file.txt" FORMAT_FILE="curl-format.txt" # 创建临时文件存储耗时日志 temp_time_log=$(mktemp) # 执行Curl命令,把耗时输出写入临时文件 curl -f -H 'Cache-Control: no-cache' -w "@$FORMAT_FILE" -o /dev/null -s "$IP_PORT/$FILE_NAME" > "$temp_time_log" # 获取Curl的退出码 exit_code=$? # 根据退出码判断结果 if [ $exit_code -eq 0 ]; then echo "✅ 文件下载成功,耗时信息:" cat "$temp_time_log" else echo "❌ 请求失败(目标文件不存在或服务器错误),退出码:$exit_code" # 若需要查看失败时的耗时,取消下面注释 # echo "失败时的耗时信息:" # cat "$temp_time_log" fi # 清理临时文件 rm "$temp_time_log"
方案2:精准判断“文件不存在”场景
如果想更精准区分是「文件不存在(404)」还是其他服务器错误,可以修改curl-format.txt加入HTTP状态码,再解析判断:
- 更新
curl-format.txt,添加状态码行:time_namelookup: %{time_namelookup} time_connect: %{time_connect} time_appconnect: %{time_appconnect} http_code: %{http_code} - 修改脚本逻辑:
# 前面步骤同方案1... if [ $exit_code -eq 0 ]; then echo "✅ 文件下载成功,耗时信息:" cat "$temp_time_log" else # 提取HTTP状态码 http_code=$(grep -oP 'http_code: \K\d+' "$temp_time_log") if [ "$http_code" -eq 404 ]; then echo "❌ 目标文件不存在(HTTP 404)" else echo "❌ 服务器返回错误状态码:$http_code" fi fi
核心逻辑总结
- 用
-f参数让Curl把HTTP错误转化为非0退出码,这是判断请求成败的核心依据 - 通过shell条件判断+临时文件,实现“仅成功时输出耗时”的需求
- 额外结合
%{http_code}变量,可以精准定位「文件不存在」这类特定失败场景
内容的提问来源于stack exchange,提问作者nmnir
相关产品推荐
相关产品推荐

