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

Bash脚本中无法对grep输出的value变量应用条件判断

解决cf-cache-status响应头值的条件判断问题

问题背景

通过curl请求目标站点获取响应头,筛选出指定头后,希望先定位到cf-cache-status头,再判断它的取值(可选值:EXPIRED、HIT、DYNAMIC、MISS),但直接对$value变量做相等判断时始终不生效。

问题根源

从输出结果可以看到,$value变量包含前导空格(例如 DYNAMIC),而判断时用的是不带空格的字符串("DYNAMIC"),导致匹配失败。这是因为响应头的格式是头名: 值,冒号后有空格,用IFS=:分割时,空格会被包含到$value中。

解决方案

方式一:循环内嵌套判断(保留原有逻辑)

先匹配目标header,再处理$value的前导空格,之后做值判断:

while IFS=: read -r header value; do
    # 先定位到cf-cache-status头
    if [ "$header" == "cf-cache-status" ]; then
        # 去除value的前导/尾随空格
        trimmed_value=$(echo "$value" | xargs)
        # 嵌套判断目标值
        case "$trimmed_value" in
            DYNAMIC|HIT|MISS|EXPIRED)
                echo "$header: $trimmed_value"
                # 可在此添加对应值的处理逻辑
                ;;
        esac
    fi
done <<< "$headers"

也可以用bash正则匹配,无需提前去除空格:

while IFS=: read -r header value; do
    if [ "$header" == "cf-cache-status" ]; then
        # 正则匹配带前导空格的目标值
        if [[ "$value" =~ ^[[:space:]]*(DYNAMIC|HIT|MISS|EXPIRED)$ ]]; then
            echo "$header: ${BASH_REMATCH[1]}"
        fi
    fi
done <<< "$headers"

方式二:直接提取目标值(更高效)

既然只关注cf-cache-status,无需循环所有筛选出的头,直接提取对应值后判断:

# 从curl输出中提取cf-cache-status的值(自动去除前后空格)
cache_status=$(echo "$OUTPUT" | grep -i 'cf-cache-status' | sed -E 's/^cf-cache-status:[[:space:]]*(.*)$/\1/i')

# 判断值并处理
case "$cache_status" in
    DYNAMIC)
        echo "缓存状态:动态内容"
        ;;
    HIT)
        echo "缓存状态:命中缓存"
        ;;
    MISS)
        echo "缓存状态:未命中缓存"
        ;;
    EXPIRED)
        echo "缓存状态:缓存已过期"
        ;;
esac

内容的提问来源于stack exchange,提问作者Jeff S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:37:34