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

Bash脚本Redis集群健康检查if..else判断异常求助

嘿,我一眼就瞅出问题所在了——你脚本里的$result变量表面看是fail,但实际上藏了个看不见的换行符,导致和"fail"的精确比对不成立,所以才没触发exit 1的逻辑!

问题根源

终端输出的fail看起来干净,但通过redis-cli | grep | cut管道出来的结果,默认会带一个换行符。你脚本里的判断是[ "$result" = "fail" ]——一个带换行的字符串和纯fail当然不相等,自然跳不过if分支。

几种修复方案任选其一

1. 直接清理变量里的空白字符

在赋值时用tr去掉所有换行和空格,确保变量里只有纯文本:

#!/bin/bash

result="$(redis-cli -c -p 30006 --raw cluster info | grep cluster_state: | cut -d ":" -f2 | tr -d '\n ')"

echo "$result"

if [ "$result" = "fail" ]; then
    echo "failed"
    exit 1
fi

2. 用awk一步到位提取(更可靠)

awk能直接匹配行并提取内容,避免管道带来的多余字符,再用xargs自动trim空白:

#!/bin/bash

result="$(redis-cli -c -p 30006 --raw cluster info | awk -F':' '/cluster_state:/ {print $2}')"
# xargs会自动去掉前后空白和换行
result=$(echo "$result" | xargs)

echo "$result"

if [ "$result" = "fail" ]; then
    echo "failed"
    exit 1
fi

3. 用模式匹配替代精确比对

如果不想折腾字符清理,直接用bash的双中括号做模糊匹配,只要变量里包含fail就触发逻辑:

#!/bin/bash

result="$(redis-cli -c -p 30006 --raw cluster info | grep cluster_state: | cut -d ":" -f2)"

echo "$result"

# =~ 是bash的正则匹配,忽略前后空白
if [[ "$result" =~ fail ]]; then
    echo "failed"
    exit 1
fi

验证问题的小技巧

你可以在脚本里加一行,用od命令打印变量的ASCII码,就能看到隐藏的换行符了:

echo "$result" | od -c

如果输出里有\n,那实锤就是换行符搞的鬼~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:50:16