我一直在使用shell脚本编写这个函数来从用户那里获取密码,并检查它是否满足成为有效密码的标准,但它总是说密码不够强。我正在尝试使用的密码是LK@12abc
。
这是我的代码:
function paq()
{
read -p "PASSWORD :-" password
pasq="^(?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8}$"
if [[ $password =~ $pasq ]]; then
echo "Valid password"
echo "The password is:- $password" >> user1.txt
echo "$password" >>password.txt
else
echo "password not strong enough"
fi
}
paq
答案 0 :(得分:1)
您的密码似乎必须包含:
所以,使用bash glob模式:
if [[ $password == *[a-z]*[a-z]*[a-z]* ]] &&
[[ $password == *[A-Z]*[A-Z]* ]] &&
[[ $password == *[0-9]*[0-9]* ]] &&
[[ $password == *[!@#$\&*]* ]] &&
(( ${#password} == 8 ))
then
echo password OK
else
echo password does not satisfy criteria
fi
我很惊讶我需要在第4次测试中逃避&
答案 1 :(得分:0)
正如man bash
中所述:
可以使用另外的二元运算符=〜 优先级为==和!=。使用时,右边的字符串 运算符被视为扩展正则表达式并匹配 因此(如正则表达式(3))。
第一个问题是POSIX
正则表达式不允许前瞻
和看起来断言。
第二个问题是您的测试密码不正确 - 您 最后错过8个随机字符。
第三个问题是你没有指定
shebang
并没有正确引用变量。
总而言之,您的脚本应该是这样的:
#!/usr/bin/env bash
paq() {
read -r -p "PASSWORD :- " password
pasq="^(.*[A-Z].*[A-Z])(.*[!@#$&*])(.*[0-9].*[0-9])(.*[a-z].*[a-z].*[a-z]).{8}$"
if [[ "$password" =~ $pasq ]]; then
echo "Valid password"
echo "The password is:- $password" >> user1.txt
echo "$password" >>password.txt
else
echo "password not strong enough"
fi
}
paq
运行它:
$ ./paq.sh
PASSWORD :- AB!11abc12345678
Valid password
答案 2 :(得分:0)
您可以使用原始正则表达式并将其提供给var input = $("<input type='checkbox' id='" + i + "_" + j + $(this).html() + "' />");
li.append(input); //li is a variable created elsewhere
input.isSelected = false;
input.select = function () {
this.isSelected = true;
console.log(this.isSelected); //true
}
input.deselect = function () {
this.isSelected = false;
console.log(this.isSelected); //false
}
input.select(); //logs true
input.on("click", function () {
console.log(this.isSelected); //undefined
if(this.isSelected){
this.deselect(); //does not get called
}else{
this.select(); //does not get called
}
})
(仅当您的系统的grep -P
支持Perl正则表达式时)。然后使用脚本:
grep
答案 3 :(得分:0)
使用tr
将每个想要的字符类转换为数字,sort
该数字字符串并计数与grep
的匹配(使用@glennjackman定义的字符类除了确切的长度):
echo LK@12abc |
tr '[:digit:]' 1 | # do this first
tr '[:upper:]' 2 |
tr '[:lower:]' 3 |
tr '[:punct:]' 4 |
tr -c '[:digit:]' 5 | # all else to 5
grep -o . | # transpose
sort | # sort
tr -d '\n' | # transpose
if
grep -q "1\{2,\}2\{2,\}3\{3,\}4\{1,\}5" # 5 is the trailing newline
then
echo yes
else
echo no
fi # outputs
yes
(我试图tr '[:digit:][:upper:][:lower:]' '123'
,但显然不会工作,所以每个类现在都在自己的行上处理。也许你可以松开tr
,只需对密码字符串进行排序并使用grep
)