一致するものがない場合は 0 を返し、一致するものがある場合は 1 を返すgrep -q
組み合わせを使用すると、入力が 1 行の 1 つ動作します。-v
$ 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.
1行だけを提供し、一致しない行のみを選択するabc
ように指示した場合は、空の出力を取得して1のようなコードを返します。grep
a
a
3つの行を提供する場合、b
sumは出力から得られた合計と一致しない行のみを選択し、戻りコードとして0を選択するようにc
指示します。grep
a
b
c
$ echo -e 'a\nb\nc' | grep -v a; echo $?
b
c
0