私はしばらくこれをやってきましたが、何十ものウェブサイトにアクセスしてさまざまな組み合わせを試しましたが、予想通りスクリプトは実行されません。その会社で働いていてもhttps://regex101.com/、まだbashで動作させることはできません。
入力("$password")の長さが8文字以上で、1つ以上の数字と次の特殊文字のうち1つ以上が含まれていることを確認するbashスクリプトを作成しようとしています。 #?!@$ %^ &* -
GNU bash、バージョン 5.1.16(1)-release-(x86_64-pc-linux-gnu)
どんな助けでも大変感謝します!
read -p "Please enter a password to test: " password
echo "You entered '$password'"
# I have tried all of the following (plus a few others) and cannot get it to work
#regex='^[a-zA-Z0-9#@$?]{8,}$'
#regex='^[a-zA-Z0-9@#$%&*+-=]{8,}$'
#regex='^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[@#$%&*+-=]).{8,}$'
#regex='^(?=.*?[a-zA-Z0-9])(?=.*?[#?!@$ %^&*-]).{8,}$'
#regex='^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[#?!@$ %^&*-]).{8,}$'
if [[ $password =~ $regex ]]; then
echo "This works"
else
echo "Nope"
fi
ベストアンサー1
サポートされている拡張正規表現構文には、bash
複数のサブ式間でブール論理積テストを実行する単一式を構成する機能はありません。したがって、条件ごとに1つのテストをより簡単に実行できます。
あなたの文字列は3つの条件を満たす必要があるようです。
- 8文字以上です。
- 少なくとも1桁(「数字」を意味するようです)。
- グループに1つ以上のキャラクターがあります
#?!@$ %^&*-
。
これは3つのテストを意味します。
if [ "${#password}" -ge 8 ] &&
[[ $password == *[[:digit:]]* ]] &&
[[ $password == *[#?!@$\ %^\&*-]* ]]
then
echo 'good'
else
echo 'not good'
fi
最終テストでは、いくつかの特殊文字をエスケープする必要がありました。変数を使用して、よりきれいに見えるようにすることができます。
has_digit='*[[:digit:]]*'
has_special='*[#?!@$ %^&*-]*' # or possibly '*[[:punct:]]*'
if [ "${#password}" -ge 8 ] &&
[[ $password == $has_digit ]] &&
[[ $password == $has_special ]]
then
echo 'good'
else
echo 'not good'
fi
ここでは正規表現を使用せず、一般的なシェルパターンを使用しています。一致するセットは、少し大きい「句読点」セットです(特にスペース文字は含まれていませんが、またはまたは[[:punct:]]
使用できます)。[[:punct:] ]
[[:punct:][:blank:]]
[[:punct:][:space:]]
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
本当に正規表現を使用する必要がある場合は、次のようにします。
has_8='.{8}'
has_digit='[[:digit:]]'
has_special='[#?!@$ %^&*-]' # or possibly '[[:punct:]]'
if [[ $password =~ $has_8 ]] &&
[[ $password =~ $has_digit ]] &&
[[ $password =~ $has_special ]]
then
echo 'good'
else
echo 'not good'
fi
変化するパターンに注意してください。
このサイトに関する一般的な注意点は、regex101.com
ほとんどの標準のUnixテキスト処理ツールで使用されているPOSIX正規表現を特別にサポートしていると主張するのではなく、これらの正規表現のさまざまな拡張バリエーションのみをサポートすると主張していることです。