You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:36:03