web-dev-qa-db-ja.com

Linux grepの戻りコード

次のコードが1を返す理由を確認するのに苦労しています。

echo 'Total' | grep -c No
0

したがって、「合計」に「いいえ」は存在しません。しかし、その戻りコードを調べると、1と表示されています。

echo $?
1

戻りコードが1として表示されるのはなぜですか?これを回避する方法はありますか?

22
difurious

man grepページによると、-cフラグは

-c、--count通常の出力を抑制します。代わりに、入力ファイルごとに一致する行の数を出力します。

したがって、表示されるのは一致のカウントであり、grep一致の終了コードと混同しないでください。コード1は、入力から一致する行がないためです。

他のケースを見てください、

echo 'No' | grep -c No
1

echo $?
0

EXIT CODESページのman grepで読むには、

終了ステータス通常、終了ステータスは、行が選択されている場合は0、行が選択されていない場合は1、エラーが発生した場合は2です。

27
Inian

Grepによって何も一致しなかったため、終了コードは1です。

終了ステータス選択した行が見つかった場合、終了ステータスは0、見つからない場合は1です。エラーが発生した場合、終了ステータスは2です(注:POSIXエラー処理コードは「2」以上を確認する必要があります)。

「合計」のカウントがゼロであるため、出力はゼロです。これは、-cオプションによるものです。

-c、--count通常の出力を抑制します。代わりに、入力ファイルごとに一致する行の数を出力します。 -v、-invert-matchオプション(下記参照)を使用すると、一致しない行をカウントします。 (-cはPOSIXで指定されます。)

0の終了コードを強制する場合は、コマンドに|| trueを追加するだけです。

echo 'Total' | grep -c No || true
18
rutgerm