パターンが見つからない場合、シェルスクリプトが早期に終了するのを防ぐための `set -e` と `grep` 慣用語

パターンが見つからない場合、シェルスクリプトが早期に終了するのを防ぐための `set -e` と `grep` 慣用語

助けが必要です - GNU / LINUX bashのシェルスクリプト環境で:

私はいつも使用しますset -e。常に望むわけではありませんが、終了ステータスがパターンを見つけることができないことを示すときにgrepスクリプトの実行を終了したいと思います。grep1

この問題を解決する方法は次のとおりです。

(私を試してみてください)そのような方法でgrepを呼び出す
と、将来の管理者がアクティブになるまで希望の動作を得ることができます。また、私はアクティブにするのが好きなので、これは私には適していません。set +o pipefailgrep 'p' | wc -lpipefailpipefail

(2回試行)パターンに一致する行のみを
使用するsedか印刷してから、一致する行を使用して一致するパターンをテストします。 toを使用することが私の実際の問題に対する解決策であると思われるので、このオプションは気に入らません。awkwcsedgrep

(試行III)
これは私が一番好きではありません。次のようになります。set +e; grep 'p'; set-e

どんな洞察力/慣用句にも大変感謝いたします。ありがとうございます。

ベストアンサー1

条件にgrepを入れるifこともでき、終了状態に興味がなければ|| true

例:grepシェルの終了

$ bash
$ set -e
$ echo $$
33913
$ grep foo /etc/motd
$ echo $$
9233

解決策1:0以外の終了ステータスを削除する

$ bash
$ set -e
$ echo $$
34074
$ grep foo /etc/motd || true
$ echo $$
34074

解決策2:終了ステータスを明示的にテストする

$ if ! grep foo /etc/motd; then echo not found; fi
not found
$ echo $$
34074

Bashのマニュアルページディスカッションからset -e

失敗したコマンドが直ちにコマンドリストの一部である場合、シェルは終了しません。しかし、または~まで キーワード、テストの一部もしまたは一生予約語、実行されたコマンドの一部 &&またはリストされた最後のコマンドの後のコマンドは除外&&または、最後のコマンドを除くパイプライン内のすべてのコマンドまたは戻り値が次のようなコマンド

おすすめ記事