String 计算字符串中某个范围内的字符出现的次数
所以我对bash和脚本一般来说都是新手。我是一名学生,我们被指派创建一个密码检查器,检查命令$1处的参数是否符合密码标准。如果$1为空,脚本应该生成一个可接受的密码(这一部分的完成非常感谢这里的另一个线程) 我遇到的一个问题是检查$1的条件,因为密码有一个特定的标准。密码标准如下:String 计算字符串中某个范围内的字符出现的次数,string,bash,comparison,String,Bash,Comparison,所以我对bash和脚本一般来说都是新手。我是一名学生,我们被指派创建一个密码检查器,检查命令$1处的参数是否符合密码标准。如果$1为空,脚本应该生成一个可接受的密码(这一部分的完成非常感谢这里的另一个线程) 我遇到的一个问题是检查$1的条件,因为密码有一个特定的标准。密码标准如下: 至少有一个大写字母 至少一个小写字母 至少一位数字 $1大小必须至少为8个字符,且小于16个字符 “@$%&*-=+”范围内的一个且仅有一个符号 我将脚本设置为一系列嵌套的if语句,这些语句在出现可能性时会一路向
- 至少有一个大写字母
- 至少一个小写字母
- 至少一位数字
- $1大小必须至少为8个字符,且小于16个字符
- “@$%&*-=+”范围内的一个且仅有一个符号
有什么建议吗?
-
在字符类中有特殊含义,它表示一个范围。将其移动到类的开头或结尾:
$ echo :/, | grep -o "[@#$%&*-=+]" | wc -l
3
$ echo :/, | grep -o "[@#$%&*=+-]" | wc -l
0
$ echo :/, | grep -o "[-@#$%&*=+]" | wc -l
0
对于它仍然值得的,这里有一个解决方案,所有检查都是在一个进程中完成的 对于Linux:
expr\(\
\(+“$1”:“.*[A-Z]\)\&\
\(+“$1”:“.*[a-z]\)\&\
\( + "$1" : '.*[0-9]' \) \& \
\( + "$1" : '.*[-@#$%&*=+]' \) \& \
\( ${#1} \>= 8 \) \& \
\(${1}\/dev/null&&\
回声ok
对于*BSD:
expr\(\
\(“$1”:“.*[A-Z]\)\&\
\(“$1”:“.*[a-z]\)\&\
\( "$1" : '.*[0-9]' \) \& \
\( "$1" : '.*[-@#$%&*=+]' \) \& \
\( ${#1} \>= 8 \) \& \
\(${1}\/dev/null&&\
回声ok
Brilliant。如果在if语句中以$(echo…| grep…| wc-l)的形式完成,则实际上效果非常好。非常感谢!谢谢,尽管我最终不得不重新编写整个脚本,因为我遇到了一些愚蠢的问题。结果是我的脚本过去超过300个字符,但现在我的脚本可能不足100个字符。它不是一路向下,而是只检查一个嵌套if语句中的所有条件,该语句检查$1是否为1不为null。如果$1不为null,它将逐个检查条件,并在执行时回显错误。
$ myword="a!uuu??7889%"
$ res="${myword//[^,!#%&*?@^|+-]}"
$ echo "The original word : $myword"
$ echo "Special characters : $res"
$ echo "number of special characters : ${#res}"
The result is this
The original word : a!uuu??7889%
Special characters : !??%
number of special characters : 4