ディレクトリ名を含むファイルがあります:
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 より大きいことを義務付けていることに注意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