使用Curl上传文件时获取HTTP状态码并记录Curl输出的实现方案
合并Curl文件上传、日志记录与HTTP状态码获取
我来帮你把这两个需求合并成一次Curl调用,既完成文件上传、把所有输出追加到日志,又能把HTTP状态码存到变量里供后续逻辑使用。下面给你两种可行的方案,你可以根据场景选择:
方案一:直观易维护(适合大多数场景)
这个方法把所有输出先捕获到变量,再写入日志,同时提取状态码,逻辑清晰,容易调试:
# 先把常用路径和URL定义成变量,后续改起来方便 LOCAL_FILE="/home/user/mydir/filename" UPLOAD_URL="<my url>/.../filename" LOG_FILE="/home/user/mydir/script.log" # 执行Curl上传,捕获所有输出(包括响应内容和错误信息),同时追加状态码到输出末尾 full_upload_output=$(curl -w '%{http_code}' -T "$LOCAL_FILE" "$UPLOAD_URL" 2>&1) # 把完整输出追加到日志文件,确保所有操作痕迹都被记录 echo "$full_upload_output" >> "$LOG_FILE" # 从输出末尾提取最后3位,就是我们要的HTTP状态码 CODE=${full_upload_output: -3} # 接下来就可以用$CODE做后续逻辑了,比如判断上传是否成功 if [ "$CODE" -eq 200 ] || [ "$CODE" -eq 201 ]; then echo "文件上传成功!状态码:$CODE" else echo "文件上传失败,状态码:$CODE" # 这里可以加失败后的处理逻辑,比如重试、告警等 fi
关键部分解释:
-w '%{http_code}':让Curl在所有输出的最后加上HTTP状态码,这是我们提取状态码的关键。2>&1:把Curl的错误输出(stderr)重定向到标准输出(stdout),这样所有内容都会被统一捕获到变量里。${full_upload_output: -3}:这是Bash的字符串截取语法,意思是取变量最后3个字符,正好对应HTTP状态码的3位数字。
方案二:低内存占用(适合大响应场景)
如果你的上传响应内容特别大,不想把整个输出存到变量里,可以用管道的方式直接分流:
# 同样先定义变量 LOCAL_FILE="/home/user/mydir/filename" UPLOAD_URL="<my url>/.../filename" LOG_FILE="/home/user/mydir/script.log" # 一次Curl调用完成所有操作:错误信息直接写入日志,响应内容+状态码通过管道写入日志,同时提取状态码到变量 CODE=$(curl -w '%{http_code}' -T "$LOCAL_FILE" "$UPLOAD_URL" 2>> "$LOG_FILE" | tee -a "$LOG_FILE" | tail -c 3) # 后续逻辑和方案一一样 if [ "$CODE" -eq 200 ]; then echo "上传成功" fi
关键部分解释:
2>> "$LOG_FILE":直接把Curl的错误信息追加到日志,不用经过管道。tee -a "$LOG_FILE":把Curl的标准输出(响应内容+状态码)追加到日志,同时把内容继续传给下一个管道。tail -c 3:截取管道内容的最后3个字节,也就是HTTP状态码,存入CODE变量。
这两种方案都能满足你的需求,方案一更直观,方案二更省内存,你可以根据自己的脚本场景选择。
内容的提问来源于stack exchange,提问作者ekter15
相关产品推荐
相关产品推荐

