1. ホーム
  2. string

[解決済み】Bashでファイルに文字列が存在するかどうかをテストする方法は?

2022-04-14 13:40:48

質問

ディレクトリ名を含むファイルを持っています。

my_list.txt :

/tmp
/var/tmp

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

どのように解決するのですか?

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が終了ステータスです。しかし、エラーが発生した場合、終了ステータスは 2 になります。 -q または --quiet または --silent オプションが使用され、選択された行が見つかります。ただし、POSIXでは、以下のようなプログラムに対してのみ、選択された行を見つけることが義務付けられています。 grep , cmp および diff したがって、移植性の観点から、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