私がやろうとしているのは、ユーザー入力を取得してファイルを検索することです。一致する場合は結果が表示され、それ以外の場合は$ keyword not foundがエコーされます。
しかし、私のスクリプトは常にリターンフォールトです。
read -p "Enter keyword: " keyword
if search="$(cat ./records | grep '$keyword')"
then
echo "$search"
else
echo "$keyword not found!"
fi ;;
read -r -p 'Enter pattern: ' pattern
result=$( grep "$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 "$pattern" records; then
true
else
printf 'No match found for pattern "%s"\n' "$pattern"
fi
これにより、シェル変数に潜在的に膨大な量のデータを保存することを回避し、代わりにgrep
の終了ステータスに依存して、パターンがファイル内で見つかるかどうかを判断します。パターンが見つかった場合、一致する行が出力されます(それ以上何もする必要がないため、true
ステートメント)。
printf
の代わりにecho
を使用する場合: printfがechoよりも優れている理由
より短い:
read -r -p 'Enter pattern: '
grep "$REPLY" records || printf 'No match found for pattern "%s"\n' "$REPLY"
下記参照:
_read -p "Enter keyword: " keyword
if search=$(grep "$keyword" ./records)
then
echo "$search"
else
echo "$keyword not found!"
fi
_
$()
では引用符を使用しないでくださいcat
でgrep
パイピングを使用する必要はありません。代わりに_grep <pattern> file
_を使用してくださいfi
の後に_;;
_を削除します