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