私のコードでこのようなことをしました。
file_nm=`ls -latr *abc*`
if [ `grep "search_txt" "$file_nm" | wc -l` -gt 0 ]
then
echo "string found"
else
echo "string not found"
fi
file_nm
空白であると、私のコードがgrep
予想されるので中断されますfile_nm
。このコードをどのように機能させることができますか?grep
ファイルが存在しない場合にコマンドをバイパスするオプションはありますか?
答え1
努力する:
grep "search_txt" /dev/null "$file_nm"
/dev/null
処理できるファイルは常に1つ以上あるため、フィードを使用すると存在しなくても機能します。grep
$file_nm
grep
/dev/null
答え2
これを大幅に簡素化できます。迷惑な質問以下を実行して、ls(固有)を解析します。
file_nm=$(find . -maxdepth 1 -name "*abc*");
[ -e "$file_nm" ] && grep -q "search_txt" "$file_nm" &&
echo "string found" ||
echo "string not found"
ただし、元の例のように複数の一致するファイルがある場合は、*abc*
次のようにします。
for i in *abc*; do
grep -q "search_txt" "$i" &&
echo "string found in $i" ||
echo "string not found in $i"
done
複数のファイルの一致に気にせず、一致するファイルの中に*abc*
文字列が含まれているかどうかを知りたい場合は、search_txt
次のようにします。
grep -q "search_txt" *abc* && echo "string found" || echo "string not found"
答え3
次のようないくつかの問題があります。
- 公開したコードは中断されません。
- などの名前のファイルを探すという意味の
-l
フラグを使用します。ls
-rw-r--r--
ls
出力を完全に解析することは避けるべきです。
そしてテスト出力は不要で、grep
終了状態のみを使用できます。からman grep
:
EXIT STATUS
The exit status is 0 if selected lines are found, and 1 if not found.
同じことを行う単純化されたバージョンは次のとおりです。
if grep -q "search_txt" *abc*
then
echo "string found"
else
echo "string not found"
fi