if文とgrep [重複]

if文とgrep [重複]

私が望むのは、ユーザー入力を受け取り、ファイルを検索することです。一致するものがある場合は結果が表示され、そうでない場合は$ 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
  1. $()上記の@jasonwryanのように引用符を使用しないでください。
  2. catパイプを使用する必要はありませんgrepgrep <pattern> file代わりに使用
  3. ;;後で削除fi

関連情報