Bash中字符串比较失效问题:命令赋值后判断不执行排查
问题分析与解决
核心问题是:你通过管道获取的$variable变量,表面看是false,但实际上包含了不可见的空白字符(比如换行符、空格),导致和字面量"false"的字符串匹配失败。
为什么会这样?
第一个脚本里的variable=false是直接赋值的纯字符串,没有任何多余字符。但第二个脚本中,source script.sh、awk、sed的管道输出,很可能会在结果末尾带上换行符(这是大多数命令输出的默认行为)——虽然echo $variable看起来只显示false,但那是因为echo会把变量里的换行当成分隔符,不会显示出来。
怎么验证?
你可以用以下命令查看变量的真实内容:
printf "%q\n" "$variable" # 或者 echo "$variable" | od -c
如果结果里带有\n(换行符)或者其他空白字符,就说明猜对了。
解决办法
有几种方式可以清理变量里的多余字符:
在sed里同时去除前后空白和换行:
修改你的命令,让sed不仅去掉逗号,还清理前后的空白和换行:variable=$(source script.sh \ | awk -F":" '/maintenanceMode\>/ { print $2 }' \ | sed 's/,//g; s/^\s*//; s/\s*$//' )(另外注意:你awk里的
print $2i看起来像是笔误,应该是print $2吧?如果保留$2i,awk会把第2个字段和字符i拼接,可能得到错误结果)用xargs自动清理空白:
在管道最后加xargs,它会自动去掉多余的换行、空格:variable=$(source script.sh \ | awk -F":" '/maintenanceMode\>/ { print $2 }' \ | sed 's/,//g' | xargs )在判断时忽略空白:
如果你不想修改变量赋值,也可以在条件判断里用正则匹配:if [[ "$variable" =~ ^false$ ]]; then echo hello fi这个正则会匹配以
false开头和结尾的内容,忽略前后的空白。
额外提示
以后遇到这种“变量看起来正确但判断不成立”的问题,第一时间检查变量里的不可见字符,printf "%q"是非常好用的调试工具。
内容的提问来源于stack exchange,提问作者TheNewGuy
相关产品推荐
相关产品推荐

