计算字符串

时间:2015-06-12 15:30:55

标签: string bash comparison

所以我对bash和脚本编写有点新意。我是一名学生,我们已经获得了一项创建密码检查程序的任务,该检查程序检查命令的$ 1参数是否符合密码标准。如果$ 1为空,则脚本应生成一个可接受的密码(该部分完全归功于此处的另一个线程)。

我遇到问题时,由于密码的一个特定标准,检查$ 1的条件。密码标准如下:

  • 至少一个大写字母
  • 至少一个小写字母
  • 至少一位数
  • $ 1大小必须至少为8个字符,且少于16个
  • “@ $ $& * - = +”
  • 范围内的一个且只有一个符号

我将脚本设置为一系列嵌套的if语句,以消除它们出现时的可能性 - 即如果大小合适但其他错误则继续下一个'级别';如果大小错误但其他一切都很好,那么回声大小是错误的等等。

我的脚本正确识别大写,小写,数字,大小,并且至少有一个符号,但我无法弄清楚如何检查一个且只有一个特殊字符。

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

  

回音$ 1 | grep -o“[@#$%&amp; * - = +]”| wc -l <​​/ p>

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

有什么建议吗?

3 个答案:

答案 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