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
相关产品推荐
相关产品推荐

