私が望むのは、ユーザー入力を受け取り、ファイルを検索することです。一致するものがある場合は結果が表示され、そうでない場合は$ keyword not Foundが表示されます。
しかし、私のチケットは常にエラーを返します。
read -p "Enter keyword: " keyword
if search="$(cat ./records | grep '$keyword')"
then
echo "$search"
else
echo "$keyword not found!"
fi ;;
答え1
read -r -p 'Enter pattern: ' pattern
result=$( grep -e "$pattern" records )
if [ -n "$result" ]; then
printf '%s\n' "$result"
else
printf 'No match found for pattern "%s"\n' "$pattern"
fi
search
(私のコードでは)への割り当てはステートメントの外で行うのがresult
最善です。if
-n
結果をテストするには(「この文字列は空ではありませんか?」)を使用してください。変数を一重引用符で囲まないでください(これにより、シェルが値を拡張するのを防ぐことができます)。二重引用符に変更します。
「キーワード」ではなく「パターン」に注目してください。ここで行う方法では、ユーザー
grep
提供の文字列を正規表現(パターンなどcat.*dog
)として使用しますが、必ずしも通常の固定文字列として使用する必要はありません。cat
ファイルをリンクするために使用する必要があり、ほとんどの場合、やや役に立ちません。read -r
ユーザーがバックスラッシュを入力できるようにするために使用されます。
または:
read -r -p 'Enter pattern: ' pattern
if ! grep -e "$pattern" records; then
printf 'No match found for pattern "%s"\n' "$pattern"
fi
これは、シェル変数に潜在的に大量のデータを格納するのを防ぎ、代わりに終了状態を使用してgrep
ファイル内のパターンを見つけることができるかどうかを決定します。パターンが見つかると、一致する行が印刷されます(他の操作を実行する必要はありません)。
printf
代わりに使用についてecho
:なぜprintfがechoより優れているのですか?
短い場合は、段落ORを使用してください。
read -r -p 'Enter pattern: '
grep -e "$REPLY" records ||
printf 'No match found for pattern "%s"\n' "$REPLY"
答え2
以下を参照してください。
read -p "Enter keyword: " keyword
if search=$(grep "$keyword" ./records)
then
echo "$search"
else
echo "$keyword not found!"
fi
$()
上記の@jasonwryanのように引用符を使用しないでください。cat
パイプを使用する必要はありませんgrep
。grep <pattern> file
代わりに使用;;
後で削除fi