我正在尝试使用我的密码检查程序脚本使正则表达式工作,但由于某种原因它只是不接受它。我想要做的是需要以下字符,最小值: 两个大写字母,两个小写字母,最少2个数字和最少两个特殊字符。我正在寻找的特殊角色只是"!@"就是这样。 这是脚本,
#!/bin/bash
read -s -p "Enter Password: " password
password_length=${#password}
if [ $password_length -lt 8 -o $password_length -gt 20 ] ;then
echo -e "Invalid password - should be between 8 and 20 characters in length.";
echo ;
else
# Check for invalid characters
case $password in
*[^a-zA-Z0-9]* )
echo -e "Password contains invalid characters.";
echo ;
;;
* )
echo "Password accepted.";
echo;;
esac
fi
答案 0 :(得分:0)
BASH正则表达式引擎不像你的正则表达式那样支持外观。
此示例适用于: 密码至少应为6个字符,并且至少有一个数字和至少一个大写字母。
您可以使用以下shell glob检查来确保密码符合您的条件:
[[$ {#s} -ge 6&& " $ S" == [A-Z] && " $ S" == [a-z] && " $ S" == [0-9] ]]
答案 1 :(得分:0)
我没有一个好的答案。目前我正在使用grep
,因为它有一个更强大的正则表达式引擎。
这样的事情:
#!/usr/bin/env bash
while true; do
echo "Password must contain 2 upper case characters and two numbers"
read -s -p "Enter Password: " password
echo
FAIL=no
# Mininum 8 characters
[[ ${#password} -ge 8 ]] || FAIL=yes
# Must contain 2 upper case letters
echo $password | grep -q "[A-Z].*[A-Z]" || FAIL=yes
# Must contain 2 digits
echo $password | grep -q "[0-9].*[0-9]" || FAIL=yes
# Must contain one non-alphanumeric character (no spaces)
echo $password | grep -q "[^a-zA-Z0-9 ]" || FAIL=yes
[[ ${FAIL} == "no" ]] && break
echo "Password invalid"
done
echo "Password $password is valid"
无论如何,我要做的是分别针对每个要求测试可能的密码,因为它很容易在正则表达式中丢失,你可能会错过一些边缘情况。