grepコマンドで-qパラメータの用途は何ですか? [閉鎖]

grepコマンドで-qパラメータの用途は何ですか? [閉鎖]
echo "$password" | grep -q [A-Z]

-qこのコマンドは何をしますか?

ベストアンサー1

-qgrepパターンに一致する行が見つかった場合は成功状態で終了し、入力に一致する行が見つからない場合は失敗状態で終了し、そうでなければ標準出力に何も印刷しないように指示します。

通常、次のような状況で使用されます。

if grep -q foo file; then
  echo file contains foo
fi

または:

find . -type f -exec grep -q foo {} \; \
               -exec printf '"%s" contains foo\n' {} \;

または:

<"$file" grep -q -xFe "$expected_line" ||
  die "Expected line not found in $file"

ここで、コード例はいくつかの理由で間違っています。

  • [A-Z][A-Z]はシェルglob演算子でもあるため、引数が文字通りに渡されるように引用符で囲む必要があります。たとえば、名前が存在し、現在のディレクトリにgrepファイルがある場合、シェルはそのファイルに展開され、最終的に次のようになります。とファイル内のファイル。AZX[A-Z]grep -q A X ZAXZ
  • パターンマッチングは[A-Z]ロケールによって異なり、通常はややランダムです。ABCDEFGHIJKLMNOPQRSTUVWXYZユーザーは通常、意図したとおりに文字を一致させる[A-Z]必要があります[ABCDEFGHIJKLMNOPQRSTUVWXYZ]
  • echo実装に応じてバックスラッシュを含むおよび/または-。で終わるため、任意のデータを出力するためには使用できません。
  • また、入力がテキストでない場合の動作は指定されていないため、まずコンテンツがユーザーロケールで有効なテキストであることをgrep確認することをお勧めします。$password

だからここにあります:

if
  printf '%s\n' "$password" | grep -q '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]'
then
  echo the password contains at least one ASCII uppercase letter
fi

または:

if
  printf '%s\n' "$password" | grep -q '[[:upper:]]'
then
  echo "the password contains at least one letter considered uppercase in the user's locale"
fi

より正確になります。 POSIXシェルではそれは必要ありませんが、grep次のようにすることができます。

case $password in
  (*[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*) echo contains ASCII uppercase;;
  (*[[:upper:]]*) echo no ASCII uppercase, but some other uppercase;;
  (*) echo no uppercase;;
esac

おすすめ記事