web-dev-qa-db-ja.com

入力文字列がファイルに存在するかどうかを確認します

string1を読み取るにする必要があります。どうすればよいですか?これが私のコードです:

#!/bin/sh
echo "Enter your sting: "
read read string1
if [ grep -q $string1 file.txt ];then
   echo "Found it"
else
   echo "Sorry this string not in file"
fi
exit 0
1
BigAlligator
  • readコマンドが間違っています。read string1である必要があります(また、readがバックスラッシュをマングルするのを防ぐために-rを使用する必要があります:read -r string1);
  • テストも間違っています。grepの出力を評価するのではなく、戻り値を評価するため、if grep -q $string1 file.txtである必要があります。
  • -Fオプションをgrepに渡して、正規表現のメタ文字を次のように解釈しないようにする必要があります。if grep -qF $string1 file.txt
  • $string1を二重引用符で囲む必要があります。これは、潜在的なファイル名の展開やWordの分割を防ぐためです:if grep -qF "$string" file.txt

その他の注意事項:

  • 末尾のexit 0は冗長であり、実際には必要ありません。スクリプトがエラーなしでそのポイントに到達しても、0を返します。
  • ShellCheck は、スクリプトのデバッグに非常に役立つリソースです。

したがって、上記に従って修正されたスクリプトは次のようになります。

#!/bin/sh
echo "Enter your sting: "
read string1
if grep -qF "$string1" file.txt;then
   echo "Found it"
else
   echo "Sorry this string not in file"
fi
1
kos

結果、この場合の一致数を変数に保存する方が常に良いと思います。

つまり、2つの選択肢があり、grep -cを使用して一致した行をカウントします

count=$(grep -c "$string1" file.txt)

または、一致した行をgrep -oからwcにパイプします(--only-matches)

count=$(grep -o "$string1" file.txt | wc -l)

これは、2番目のオプションを持つ完全なスクリプトになります

#!/bin/sh
echo "Enter your string: "
read string1
count=$(grep -o "$string1" file.txt | wc -l)
if [ $count != 0 ];then
   echo "Found it ($count times)"
else
   echo "Sorry this string not in file"
fi
exit 0

また、readを2回作成しました。

0
bistoco