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

