ファイルに特定の文字列が含まれているか、bashに含まれていないかを確認したい。このスクリプトを使用しましたが、機能しません。
if [[ 'grep 'SomeString' $File' ]];then
# Some Actions
fi
私のコードの何が問題になっていますか?
command
:stackoverflow.com/questions/12375722/...
ファイルに特定の文字列が含まれているか、bashに含まれていないかを確認したい。このスクリプトを使用しましたが、機能しません。
if [[ 'grep 'SomeString' $File' ]];then
# Some Actions
fi
私のコードの何が問題になっていますか?
command
:stackoverflow.com/questions/12375722/...
回答:
if grep -q SomeString "$File"; then
Some Actions # SomeString was found
fi
[[ ]]
ここは必要ありません。コマンドを直接実行するだけです。-q
見つかったときに文字列を表示する必要がない場合にオプションを追加します。
grep
コマンドは、検索結果に応じて、終了コードは0または1を返します。何かが見つかった場合は0。それ以外の場合は1。
$ echo hello | grep hi ; echo $?
1
$ echo hello | grep he ; echo $?
hello
0
$ echo hello | grep -q he ; echo $?
0
コマンドをの条件として指定できますif
。コマンドが終了コードで0を返す場合、それは条件が真であることを意味します。それ以外の場合はfalse。
$ if /bin/true; then echo that is true; fi
that is true
$ if /bin/false; then echo that is true; fi
$
ご覧のとおり、ここでプログラムを直接実行します。追加[]
またはなし[[]]
。
grep
asnwer stackoverflow.com/a/4749368/1702557の
-m 1
スキャンのパフォーマンスを向上させるために使用することを検討してください。最初の出現時に戻ります。
SomeString
正規表現の特殊文字(など.
)が含まれている場合、予期しない結果が生じる可能性があります。常にfgrep
(またはgrep -F
)を使用する方が安全です(本当に正規表現が必要な場合を除き、この場合egrep
(またはgrep -E
)がおそらく最良の選択です)
if
コードは、終了コードが0以外であるかどうかをチェックするだけなので、正しくありません。ファイルを読み取れないなどのエラーが発生した場合、終了コードも0以外になります。だから、あなたはのようなことをしてec=$?
、それが0
(見つかる)かどうか、それが(見つから1
ない)かどうか、そしてそれ以外のもの(失敗)かどうかをチェックする必要があります。
あなたが望むことをする方法をあなたに言った他の答えに加えて、私は何が間違っていたか(あなたが望むものである)を説明しようとします。
Bashではif
、コマンドが続きます。このコマンドの終了コードが0の場合、then
パーツが実行され、そうでelse
ない場合、パーツが実行されます。
他の回答で説明されているように、任意のコマンドでそれを行うことができます: if /bin/true; then ...; fi
[[
ファイルの存在、変数の比較など、一部のテスト専用の内部bashコマンドです。同様[
に、/usr/bin/[
ほぼ同じテストを実行します]
が、最終引数として必要な外部コマンド(通常はにあります)です。]
そのため、の場合とは異なり、左側にスペースを埋める必要があります]]
。
ここでは、必要[[
もありません[
。
もう1つは、引用する方法です。bashでは、引用符のペアがネストするケースは1つだけです"$(command "argument")"
。しかし、'grep 'SomeString' $File'
では、単語が1つしかありません'grep '
。これは、で連結されSomeString
、再びで連結された引用単位' $File'
です。$File
単一引用符を使用しているため、変数はその値でさえ置き換えられません。それを行う適切な方法はgrep 'SomeString' "$File"
です。
##To check for a particular string in a file
cd PATH_TO_YOUR_DIRECTORY #Changing directory to your working directory
File=YOUR_FILENAME
if grep -q STRING_YOU_ARE_CHECKING_FOR "$File"; ##note the space after the string you are searching for
then
echo "Hooray!!It's available"
else
echo "Oops!!Not available"
fi
最短(正しい)バージョン:
grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no"
次のように書くこともできます
grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no"
ただし、この場合は明示的にテストする必要はないので、以下と同じです。
grep -q "something" file && echo "yes" || echo "no"
if grep -q something file; then echo yes; else echo no; fi
。いじる理由$?
はまったくありません。
文字列が行全体と一致するかどうか、および固定文字列であるかどうかを確認する場合は、次のように行うことができます
grep -Fxq [String] [filePath]
例
searchString="Hello World"
file="./test.log"
if grep -Fxq "$searchString" $file
then
echo "String found in $file"
else
echo "String not found in $file"
fi
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.)
if grep -q [string] [filename]
then
[whatever action]
fi
例
if grep -q 'my cat is in a tree' /tmp/cat.txt
then
mkdir cat
fi
grep -q "something" file
[[ !? -eq 0 ]] && echo "yes" || echo "no"
$?
なく、それはまったく必要ありません-あなたはそれを行うことができますif grep -q ...
foo && truthy_action || falsey_action
は実際の三項演算子ではありません。truthy_action
失敗した場合、さらにfalsey_action
実行されます。
if
、コマンドを実行してその終了コードを確認することです。まれに$?
明示的に調べる必要はほとんどありません。