Bash脚本对比Curl GET请求头时字符串比较失效问题求助
问题根因
HTTP 响应头的行尾默认使用 CRLF(\r\n)作为结束符,你提取到的$var变量实际携带了不可见的回车符\r,存储值为HIT\r而非纯文本HIT,因此字符串恒等匹配会失败。你单独执行echo打印变量时,终端会将\r解析为回车控制符,不会显示出来,所以看不到异常。
你可以执行以下命令验证变量内是否存在回车符:
echo -n "$var" | od -c
如果输出中包含\r字符即可确认问题。
修复方案
以下几种方案任选其一即可:
- 提取变量时直接过滤回车符
修改变量赋值语句,通过tr命令删除所有回车符:
var=$(curl -I -s http://myhost.local | grep X-Magento-Cache-Debug | awk '{print $2}' | tr -d '\r')
如果你需要严格获取GET请求的响应头(部分站点HEAD请求和GET请求返回的头内容不一致),可以调整curl参数:
var=$(curl -s -o /dev/null -D - http://myhost.local | grep X-Magento-Cache-Debug | awk '{print $2}' | tr -d '\r')
调整后的curl会发送GET请求,丢弃响应体仅输出响应头。
- 改用模糊匹配逻辑
使用bash的双中括号语法做通配符匹配,规避不可见字符的影响:
var=$(curl -I -s http://myhost.local | grep X-Magento-Cache-Debug | awk '{print $2}') if [[ "$var" == *HIT* ]]; then echo "OK" else echo "NOK" exit 2 fi
- 直接用awk完成判断逻辑
省去变量存储步骤,一步完成处理和判断:
curl -I -s http://myhost.local | grep X-Magento-Cache-Debug | awk '{gsub("\r","",$2); exit $2=="HIT" ? 0 : 2}' if [ $? -eq 0 ]; then echo "OK" else echo "NOK" exit 2 fi
内容的提问来源于stack exchange,提问作者Fanis Strezos
相关产品推荐
相关产品推荐

