String 计算字符串中某个范围内的字符出现的次数

String 计算字符串中某个范围内的字符出现的次数,string,bash,comparison,String,Bash,Comparison,所以我对bash和脚本一般来说都是新手。我是一名学生,我们被指派创建一个密码检查器,检查命令$1处的参数是否符合密码标准。如果$1为空,脚本应该生成一个可接受的密码(这一部分的完成非常感谢这里的另一个线程) 我遇到的一个问题是检查$1的条件,因为密码有一个特定的标准。密码标准如下: 至少有一个大写字母 至少一个小写字母 至少一位数字 $1大小必须至少为8个字符,且小于16个字符 “@$%&*-=+”范围内的一个且仅有一个符号 我将脚本设置为一系列嵌套的if语句,这些语句在出现可能性时会一路向

所以我对bash和脚本一般来说都是新手。我是一名学生,我们被指派创建一个密码检查器,检查命令$1处的参数是否符合密码标准。如果$1为空,脚本应该生成一个可接受的密码(这一部分的完成非常感谢这里的另一个线程)

我遇到的一个问题是检查$1的条件,因为密码有一个特定的标准。密码标准如下:

  • 至少有一个大写字母
  • 至少一个小写字母
  • 至少一位数字
  • $1大小必须至少为8个字符,且小于16个字符
  • “@$%&*-=+”范围内的一个且仅有一个符号
我将脚本设置为一系列嵌套的if语句,这些语句在出现可能性时会一路向下消除这些可能性——即,如果大小合适,但其他方面有问题,则进入下一个“级别”;如果尺寸有误,但其他一切都好,则回显尺寸有误,等等

我的脚本正确地识别了大写、小写、数字、大小,并且至少有一个符号,但我不知道如何检查一个且只有一个特殊字符

我目前的思路是将$1运行到字符范围的grep中,然后如果计数大于或小于1,则给出一个错误。最接近我的是:

echo$1|grep-o“[@#$%&*-=+]”wc-l

但是输出9,我假设是字符范围的大小


有什么建议吗?

-
在字符类中有特殊含义,它表示一个范围。将其移动到类的开头或结尾:

$ 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