我想使用grep
来确定字符串是否包含子字符串(计划将结果用作bash if
语句中的test命令)。
在这里,我检查grep
的输出长度:
$ echo "abc" | grep "j" | wc -c
0
由于wc -c
显示为零,因此我知道grep
返回了一个空字符串。
但是如果我在调用wc -c
之前将grep
的输出保存到一个变量中,我会得到一个不同的值:
$ match=$(echo "abc" | grep "j")
$ echo "$match" | wc -c
1
grep
的输出现在是一个包含1个字符的字符串。
我怀疑这是一个新的行:
$ echo $match
$
为什么现在$match
中有一个额外的字符,我怎样才能防止这种情况发生?
2条答案
按热度按时间mqxuamgl1#
match
不包含换行符,但echo "$match"
写入了一个换行符(但请参见下面的注解)。在第一种情况下,您将grep
的输出直接传递给wc
,但在第二种情况下,您将grep
的输出加上一个换行符传递给wc
。但是完全不要这样做,没有必要在问题中引入
wc
,只需要测试grep返回的值即可,例如:注意,
echo "$match"
是不好的做法。例如,考虑$match
是否扩展为字符串-e
或-n
。使用printf '%s' "$match"
要健壮得多f1tvaqid2#
请考虑以下几点:
这两个命令的唯一区别是
echo
在输出的末尾附加了一个\n
。当然,我们可以通过在末尾显式添加一个
\n
来使printf
生成相同的结果: