web-dev-qa-db-ja.com

grepを使用したifステートメント

私がやろうとしているのは、ユーザー入力を取得してファイルを検索することです。一致する場合は結果が表示され、それ以外の場合は$ keyword not foundがエコーされます。

しかし、私のスクリプトは常にリターンフォールトです。

       read -p "Enter keyword: " keyword
       if search="$(cat ./records | grep '$keyword')"
       then
       echo "$search"
       else
        echo "$keyword not found!"
       fi ;;
1
Prin Puyakul
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"
1
Kusalananda

下記参照:

_read -p "Enter keyword: " keyword

if search=$(grep "$keyword" ./records)
        then
                echo "$search"
        else
                echo "$keyword not found!"
        fi
_
  1. @jasonwryanは前述のとおり、$()では引用符を使用しないでください
  2. catgrepパイピングを使用する必要はありません。代わりに_grep <pattern> file_を使用してください
  3. fiの後に_;;_を削除します
1
Egor Vasilyev