shell 将grep输出保存到变量会更改值

vd2z7a6w  于 2023-02-13  发布在  Shell
关注(0)|答案(2)|浏览(364)

我想使用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中有一个额外的字符,我怎样才能防止这种情况发生?

mqxuamgl

mqxuamgl1#

match不包含换行符,但echo "$match"写入了一个换行符(但请参见下面的注解)。在第一种情况下,您将grep的输出直接传递给wc,但在第二种情况下,您将grep的输出加上一个换行符传递给wc
但是完全不要这样做,没有必要在问题中引入wc,只需要测试grep返回的值即可,例如:

if ... | grep -q "$pattern"; then echo "$pattern was found in the input"; fi

注意,echo "$match"是不好的做法。例如,考虑$match是否扩展为字符串-e-n。使用printf '%s' "$match"要健壮得多

f1tvaqid

f1tvaqid2#

请考虑以下几点:

$ echo "$match" | od -c
0000000  \n
0000001
$ echo "$match" | wc -c
1

$ printf "$match" | od -c
0000000
$ printf "$match" | wc -c
0

这两个命令的唯一区别是echo在输出的末尾附加了一个\n
当然,我们可以通过在末尾显式添加一个\n来使printf生成相同的结果:

$ printf "$match\n" | od -c
0000000  \n
0000001

$ printf "$match\n" | wc -c
1

相关问题