
如果我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