Bash でファイルに文字列が存在するかどうかをテストするにはどうすればいいですか? 質問する

Bash でファイルに文字列が存在するかどうかをテストするにはどうすればいいですか? 質問する

ディレクトリ名を含むファイルがあります:

my_list.txt:

/tmp
/var/tmp

ディレクトリ名を追加する前に、その名前がファイル内にすでに存在するかどうかを Bash で確認したいと思います。

ベストアンサー1

grep -Fxq "$FILENAME" my_list.txt

名前が見つかった場合の終了ステータスは 0 (true)、見つからなかった場合は 1 (false) になります。

if grep -Fxq "$FILENAME" my_list.txt
then
    # code if found
else
    # code if not found
fi

説明

関連するセクションは次のとおりです。のマニュアルページgrep:

grep [options] PATTERN [FILE...]

-F--fixed-strings

        PATTERN を、改行で区切られた固定文字列のリストとして解釈し、そのいずれかが一致します。

-x--line-regexp

        行全体と完全に一致する一致のみを選択します。

-q、、--quiet--silent

        標準出力には何も書き込まれません。一致が見つかった場合は、エラーが検出された場合でも、ゼロのステータスで直ちに終了します。またはオプションも参照して-sください--no-messages

エラー処理

コメントで正しく指摘されているように、上記のアプローチでは、エラーケースを文字列が見つかったかのように黙って処理します。エラーを別の方法で処理したい場合は、オプションを省略し-q、終了ステータスに基づいてエラーを検出する必要があります。

通常、終了ステータスは、選択された行が見つかった場合は 0、そうでない場合は 1 です。ただし、または-qまたは--quietオプション--silentが使用され、選択された行が見つかった場合を除き、エラーが発生した場合は終了ステータスは 2 になります。ただし、POSIX では、、、およびなどのプログラムに対してのみ、エラーの場合の終了ステータスが 1 より大きいことを義務付けていることに注意grepcmpdiffください。したがって、移植性のために、2 と厳密に等しいのではなく、この一般的な条件をテストするロジックを使用することをお勧めします。

からの通常の出力を抑制するにはgrep、 にリダイレクトします/dev/null。標準エラーはリダイレクトされないままなので、grep印刷される可能性のあるエラー メッセージは、おそらく希望どおりにコンソールに表示されることに注意してください。

これら 3 つのケースを処理するには、次のステートメントを使用できますcase

case `grep -Fx "$FILENAME" "$LIST" >/dev/null; echo $?` in
  0)
    # code if found
    ;;
  1)
    # code if not found
    ;;
  *)
    # code if an error occurred
    ;;
esac

おすすめ記事