将grep输出保存到变量后值异常的原因及解决方法
问题解析与解决办法
为什么会出现额外字符?
你遇到的不是变量里藏了换行符,而是echo的默认行为在捣乱:
- 当
grep没匹配到内容时,它的输出是空的,所以match=$(echo "abc" | grep "j")实际上给match赋值的是空字符串。 - 但执行
echo "$match"时,echo会自动在输出末尾加一个换行符——哪怕输入是空的。这就是wc -c返回1的原因,它统计的是echo额外加的那个换行符,不是变量本身的内容。 - 而直接管道
echo "abc" | grep "j" | wc -c时,grep没有输出任何内容给wc,所以统计结果是0,这才是grep真实的输出长度。
正确的判断方式
根本不需要把grep的输出存到变量里,直接利用grep的退出状态码就能在if语句里判断:
grep匹配到内容时,退出状态是0(bash里视为"真");- 没匹配到则是非0(视为"假")。
加上静默模式-q可以让grep不输出任何内容,只返回状态,更高效:
if echo "abc" | grep -q "j"; then echo "字符串包含子串j" else echo "字符串不包含子串j" fi
更高效的内置方法
如果只是判断bash字符串里是否包含子串,完全不用调用grep这个外部命令,用bash的内置字符串匹配语法就行:
target_str="abc" sub_str="j" if [[ $target_str == *"$sub_str"* ]]; then echo "包含子串" else echo "不包含子串" fi
这种方法速度更快,也避免了管道和外部命令的额外开销。
内容的提问来源于stack exchange,提问作者PortMan
相关产品推荐
相关产品推荐

