在Bash shell中进行正则表达式密码验证

4

我正在使用Bash Shell脚本中的正则表达式。我使用以下正则表达式代码来检查密码标准:密码长度至少为6个字符,其中至少有一个数字和至少一个大写字母。我在正则表达式验证工具中进行了验证,我形成的正则表达式可以正常工作。但是,在Bash Shell脚本中它失败了。请提供您的想法。

echo "Please enter password for User to be created in OIM: "
echo "******Please Note: Password should be at least 6 characters long with one digit and one Upper case Alphabet******"
read user_passwd
regex="^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)\S{6,}$"
echo $user_passwd
echo $regex
if [[ $user_passwd =~ $regex ]]; then
    echolog "Password Matches the criteria"
else
    echo "Password criteria: Password should be at least 6 characters long with one digit and one Upper case Alphabet"
    echo "Password does not Match the criteria, exiting..."
    exit
fi

1
一个单一的正则表达式并不一定是解决这种问题的最佳方案。正如您可以从anubhava的答案中看到的那样,一系列直接对应于您要求的测试可能更简单、更易于维护。 - Keith Thompson
1
你的正则表达式检查至少有一个小写字母,但你在问题中没有提到这个要求。 - Keith Thompson
2个回答

5

您可以使用以下shell通配符检查以确保密码符合您的条件:

[[ ${#s} -ge 6 && "$s" == *[A-Z]* && "$s" == *[a-z]* && "$s" == *[0-9]* ]]

这段代码将确保输入的字符串 $s 满足以下所有条件:

  • 至少6个字符长
  • 包含至少一个数字
  • 包含至少一个大写字母
  • 包含至少一个小写字母

1
为了清晰起见,我会写成>= 6而不是> 5。顺便说一句,问题没有提到至少需要一个小写字母的要求。 - Keith Thompson
是的,>= 6 更好。我看到 OP 的正则表达式 "^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)\S{6,}$" 还检查了小写字符。 - anubhava
您好 Anubhava,非常感谢您的回答,对我来说是新的学习。我有一个疑问(希望我听起来不太蠢):我输入了一系列的输入,即输入的长度范围(从6到12),上述代码在输入长度介于6到10之间时可以工作,但在10之后,控制权转移到else条件并失败。请告诉我是否有任何特定原因?提供的输入:成功: aas12A AsaA123 123AssaA AAAsss123失败: aaaSSSAAA1 aaaSSSAAA112 - Shankar Guru
嗨,anubhava,我使用与您相同的代码如下:echo“请输入要创建用户的密码:” echo“******请注意:密码应至少为6个字符长,并具有一个数字和一个大写字母******” read user_passwd if [[${#user_passwd}> 5 &&“$user_passwd”== * [A-Z] * &&“$user_passwd”== * [a-z] * &&“$user_passwd”== * [0-9] *]]; then echo“密码符合标准” 否则 echo“密码标准:密码应至少为6个字符长,并具有一个数字和一个大写字母” echo“密码不符合标准,退出...” 退出 fi - Shankar Guru
好的,明白了,请检查更新后的答案。基本上需要使用-ge代替>= - anubhava
显示剩余4条评论

1
我正在补充anubhava的回答。他的检查对我有用,但不完全。 例如,“hello123”或“HELLO123”也通过了检查,因此它没有检测到大小写。 问题出在区域设置上,更具体地说是LC_COLLATE变量。它需要设置为“C”才能考虑大小写。 但更好的解决方案是使用字符类而不是范围表达式。 这里的解释here帮助我解决了我的问题。最终使用字符类对我有用。
[[ ${#s} -ge 6 && "$s" == *[[:lower:]]* && "$s" == *[[:upper:]]* && "$s" == *[0-9]* ]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接