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
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
を返します。したがって、上記に従って修正されたスクリプトは次のようになります。
#!/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
結果、この場合の一致数を変数に保存する方が常に良いと思います。
つまり、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回作成しました。