我在这个问题上绞尽脑汁有一段时间了。此密码检查程序可确保给定的密码包括:
除了大写字母外,代码几乎可以正常工作。当插入单个大写作为密码时,程序会更改 flagncap 的值,而它不应该更改。任何人都可以帮忙吗?
#!/bin/bash
echo "Please enter password: "
read user_passwd
flaglng=0
flagcap=0
flagncap=0
flagnum=0
if [[ ${#user_passwd} -ge 10 ]]; then
flaglng=1
fi
if [[ "$user_passwd" = *[A-Z]* ]]; then
flagcap=1
fi
if [[ "$user_passwd" = *[a-z]* ]]; then
flagncap=1
fi
if [[ "$user_passwd" = *[0-9]* ]]; then
flagnum=1
fi
if [[ "$flaglng" == 1 && "$flagcap" == 1 && "$flagncap" == 1 && "$flagnum" == 1 ]]; then
echo "Password Strong!"
fi
if [[ "$flaglng" = 0 ]]; then
echo "Weak Password! It should include at least 10 characters."
fi
if [[ "$flagcap" = 0 ]]; then
echo "Weak Password! It should include at least 1 upper case letter."
fi
if [[ "$flagncap" = 0 ]]; then
echo "Weak Password! It should include at least 1 lower case letter."
fi
if [[ "$flagnum" = 0 ]]; then
echo "Weak Password! It should include at least 1 number."
fi
Run Code Online (Sandbox Code Playgroud)
首先,你不是需要很多分支if秒。就像,根本。相反,请执行以下操作:
goodpassword=1
...
if [[ "$user_passwd" = *[A-Z]* ]]; then
echo "Weak Password! It should include at least 1 upper case letter."
goodpassword=0
fi
...
if [[ "$goodpassword" = 1 ]]; then
echo "Good password!"
fi
Run Code Online (Sandbox Code Playgroud)
要解决您的 glob 问题,请改用正则表达式。删除*并使用~.
if [[ "$user_passwd" =~ [A-Z] ]]; then
flagcap=1
fi
Run Code Online (Sandbox Code Playgroud)
正则表达式通常通过匹配和验证为您提供更多控制和功能。事实上,如果您愿意,您可以将整个脚本压缩为一个正则表达式(尽管您会失去冗长性)。
样本:
$ ./pwcheck.sh
Please enter password :
a
Weak Password! It should include at least 10 characters.
Weak Password! It should include at least 1 upper case letter.
Weak Password! It should include at least 1 number.
$ ./pwcheck.sh
Please enter password :
A
Weak Password! It should include at least 10 characters.
Weak Password! It should include at least 1 lower case letter.
Weak Password! It should include at least 1 number.
Run Code Online (Sandbox Code Playgroud)
每当您使用字符范围时,最好在脚本的开头插入export LC_ALL=C(或者C.UTF-8如果您需要支持 ASCII 范围之外的字符),否则您可能会对什么A-Z和a-z意思感到惊讶......
例如:
$ unset LC_ALL
$ export LANG=en_US.UTF-8
$ [[ 'abc' = *[A-Z]* ]] && echo Match || echo No match
Match
$ export LC_ALL=C
$ [[ 'abc' = *[A-Z]* ]] && echo Match || echo No match
No match
Run Code Online (Sandbox Code Playgroud)
shell 使用范围[A-Z]来表示在当前语言环境之间A和Z在当前语言环境中排序的所有字符。在en_US语言环境中,b在A和之间排序Z;因此abc匹配*[A-Z]*。另一方面,在C语言环境b中不会在A和之间排序Z,因为在C语言环境中字符严格按照它们的代码点排序。
| 归档时间: |
|
| 查看次数: |
2515 次 |
| 最近记录: |