回答:
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
以下は、manページのgrep
関連セクションです。
grep [options] PATTERN [FILE...]
-F
、--fixed-strings
PATTERNを、一致する改行で区切られた固定文字列のリストとして解釈します。
-x
、--line-regexp
行全体と完全に一致する一致のみを選択します。
-q
、--quiet
、--silent
静か; 標準出力には何も書き込みません。エラーが検出された場合でも、一致するものが見つかった場合は、ステータスがゼロですぐに終了します。
-s
または--no-messages
オプションも参照してください。
コメントで正しく指摘されているように、上記のアプローチは、文字列が見つかった場合と同様にエラーケースを静かに扱います。エラーを別の方法で処理する場合は、-q
オプションを省略し、終了ステータスに基づいてエラーを検出する必要があります。
通常、終了ステータスは、選択された行が見つかった場合は0、それ以外の場合は1です。ただし、
-q
or--quiet
またはor--silent
オプションが使用され、選択された行が見つかった場合を除き、エラーが発生した場合の終了ステータスは2です。ただし、そのようなプログラムのためのPOSIXだけ義務付け、grep
、cmp
、およびdiff
、エラーの場合に終了ステータスが1より大きいこと。したがって、移植性のために、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
$?
。if
ステートメントと一緒にgrepコマンドを使用することもできます(更新された回答に示されています)。
grep -Fqx "$FILENAME"
、変数の内容に含まれる正規表現の文字について心配する必要はありません。また、検索文字列でそれらを使用する必要もありません。
-q / --silent
ことが必要なのですか?エラーが発生した場合でも、bashを「すべて良い」と誤って言います。私がそれを正しく得たなら。この場合、欠陥のある概念のようです。
次の解決策について:
grep -Fxq "$FILENAME" my_list.txt
(私がしたように)-Fxq
平易な英語で何が意味するのか疑問に思われる場合:
F
:PATTERNの解釈方法に影響します(正規表現の代わりに固定文字列)x
:行全体に一致q
:Shhhhh ...最小限の印刷manファイルから:
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.
(-F is specified by POSIX.)
-x, --line-regexp
Select only those matches that exactly match the whole line. (-x is specified by POSIX.)
-q, --quiet, --silent
Quiet; do not write anything to standard output. Exit immediately with zero status if any match is
found, even if an error was detected. Also see the -s or --no-messages option. (-q is specified by
POSIX.)
私の心の3つの方法:
1)パス内の名前の簡単なテスト(これがあなたのケースであるかどうかはわかりません)
ls -a "path" | grep "name"
2)ファイル内の文字列の短いテスト
grep -R "string" "filepath"
3)正規表現を使用したより長いbashスクリプト:
#!/bin/bash
declare file="content.txt"
declare regex="\s+string\s+"
declare file_content=$( cat "${file}" )
if [[ " $file_content " =~ $regex ]] # please note the space before and after the file content
then
echo "found"
else
echo "not found"
fi
exit
ループを使用してファイルコンテンツで複数の文字列をテストする必要がある場合、たとえば、任意のcicleで正規表現を変更する場合、これはより速くなるはずです。
より簡単な方法:
if grep "$filename" my_list.txt > /dev/null
then
... found
else
... not found
fi
ヒント:/dev/null
コマンドの終了ステータスが必要な場合に送信しますが、出力は必要ありません。
-q
と同じように使用します--quiet
-q
ここでもベストアンサーに同意し、4位です。この世界では正義はありません。
私があなたの質問を正しく理解していれば、これはあなたが必要としていることをするはずです。
一行で:check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt
grep -q
ように、grepを直接使用して直接呼び出すことができif
ます。さらに、質問には、リストに追加する前にディレクトリが存在するかどうかの確認は含まれていませんでした(結局、削除されたディレクトリのリストである可能性があります)。
grepなしのソリューションは私にとってはうまくいきます:
MY_LIST=$( cat /path/to/my_list.txt )
if [[ "${MY_LIST}" == *"${NEW_DIRECTORY_NAME}"* ]]; then
echo "It's there!"
else
echo "its not there"
fi
grep -Fxq "String to be found" | ls -a
ls
標準入力を受け入れないと思いますか?