如果我grep -q
结合使用-v
,如果没有匹配则返回 0,如果有匹配则返回 1,只要输入是单行,它就可以工作:
$ echo 'abc' | grep -q -v a; echo $?
1
$ echo 'abc' | grep -q -v x; echo $?
0
但如果输入是多行,grep 将始终返回 0:
$ echo -e 'a\nb\nc' | grep -q -v a; echo $?
0
$ echo -e 'a\nb\nc' | grep -q -v x; echo $?
0
这种行为的原因是什么?
我知道在这种情况下正确的方法是使用! grep -q
而不是grep -q -v
,但我仍然想知道答案。
答案1
根据 grep 手册:
-v, --invert-match
Selected lines are those not matching any of the specified patterns.
如果您只提供一行abc
并告诉grep
仅选择不匹配的行,a
您将得到一个空输出并返回等于 1 的代码。
如果您提供三行a
、b
和 ,c
并告诉grep
您仅选择那些与a
您在输出中得到的b
和不匹配的行,c
并且 0 作为返回代码。
$ echo -e 'a\nb\nc' | grep -v a; echo $?
b
c
0