次のコードが1を返す理由を確認するのに苦労しています。
echo 'Total' | grep -c No
0
したがって、「合計」に「いいえ」は存在しません。しかし、その戻りコードを調べると、1と表示されています。
echo $?
1
戻りコードが1として表示されるのはなぜですか?これを回避する方法はありますか?
man grep
ページによると、-c
フラグは
-c、--count通常の出力を抑制します。代わりに、入力ファイルごとに一致する行の数を出力します。
したがって、表示されるのは一致のカウントであり、grep
一致の終了コードと混同しないでください。コード1
は、入力から一致する行がないためです。
他のケースを見てください、
echo 'No' | grep -c No
1
echo $?
0
EXIT CODES
ページのman grep
で読むには、
終了ステータス通常、終了ステータスは、行が選択されている場合は0、行が選択されていない場合は1、エラーが発生した場合は2です。
Grepによって何も一致しなかったため、終了コードは1です。
終了ステータス選択した行が見つかった場合、終了ステータスは0、見つからない場合は1です。エラーが発生した場合、終了ステータスは2です(注:POSIXエラー処理コードは「2」以上を確認する必要があります)。
「合計」のカウントがゼロであるため、出力はゼロです。これは、-cオプションによるものです。
-c、--count通常の出力を抑制します。代わりに、入力ファイルごとに一致する行の数を出力します。 -v、-invert-matchオプション(下記参照)を使用すると、一致しない行をカウントします。 (-cはPOSIXで指定されます。)
0の終了コードを強制する場合は、コマンドに|| true
を追加するだけです。
echo 'Total' | grep -c No || true