echo "$password" | grep -q [A-Z]
-q
このコマンドは何をしますか?
ベストアンサー1
-q
grep
パターンに一致する行が見つかった場合は成功状態で終了し、入力に一致する行が見つからない場合は失敗状態で終了し、そうでなければ標準出力に何も印刷しないように指示します。
通常、次のような状況で使用されます。
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
ファイルがある場合、シェルはそのファイルに展開され、最終的に次のようになります。とファイル内のファイル。A
Z
X
[A-Z]
grep -q A X Z
A
X
Z
- パターンマッチングは
[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