所以我对bash和脚本编写有点新意。我是一名学生,我们已经获得了一项创建密码检查程序的任务,该检查程序检查命令的$ 1参数是否符合密码标准。如果$ 1为空,则脚本应生成一个可接受的密码(该部分完全归功于此处的另一个线程)。
我遇到问题时,由于密码的一个特定标准,检查$ 1的条件。密码标准如下:
我将脚本设置为一系列嵌套的if语句,以消除它们出现时的可能性 - 即如果大小合适但其他错误则继续下一个'级别';如果大小错误但其他一切都很好,那么回声大小是错误的等等。
我的脚本正确识别大写,小写,数字,大小,并且至少有一个符号,但我无法弄清楚如何检查一个且只有一个特殊字符。
我目前的想法是将$ 1运行到grep中以获取字符范围,然后如果计数大于或小于1,则给出错误。我最接近的是:
回音$ 1 | grep -o“[@#$%&amp; * - = +]”| wc -l </ p>
但是输出9 - 我假设是字符范围的大小。
有什么建议吗?
答案 0 :(得分:2)
-
在字符类中有特殊含义,它表示范围。将其移至课程的开头或结尾:
$ echo :/, | grep -o "[@#$%&*-=+]" | wc -l
3
$ echo :/, | grep -o "[@#$%&*=+-]" | wc -l
0
$ echo :/, | grep -o "[-@#$%&*=+]" | wc -l
0
答案 1 :(得分:1)
对于它仍然值得的东西,这里有一个解决方案,所有检查都在一个过程中完成。
对于Linux:
expr \( \
\( + "$1" : '.*[A-Z]' \) \& \
\( + "$1" : '.*[a-z]' \) \& \
\( + "$1" : '.*[0-9]' \) \& \
\( + "$1" : '.*[-@#$%&*=+]' \) \& \
\( ${#1} \>= 8 \) \& \
\( ${#1} \<= 16 \) \
\) != 0 \& \
\( + "$1" : '.*[-@#$%&*=+].*[-@#$%&*=+]' \) = 0 >/dev/null && \
echo ok
对于* BSD:
expr \( \
\( "$1" : '.*[A-Z]' \) \& \
\( "$1" : '.*[a-z]' \) \& \
\( "$1" : '.*[0-9]' \) \& \
\( "$1" : '.*[-@#$%&*=+]' \) \& \
\( ${#1} \>= 8 \) \& \
\( ${#1} \<= 16 \) \
\) != 0 \& \
\( "$1" : '.*[-@#$%&*=+].*[-@#$%&*=+]' \) = 0 >/dev/null && \
echo ok
答案 2 :(得分:0)
$ 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