
Если я использую 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