【问题标题】:count how many times characters from a range occur in a string计算一个范围内的字符在字符串中出现的次数
【发布时间】:2015-08-28 16:31:15
【问题描述】:

所以总的来说,我对 bash 和脚本编写有点陌生。我是一名学生,我们的任务是创建一个密码检查器,用于检查命令 $1 处的参数是否符合密码标准。如果 $1 为空,脚本应该生成一个可接受的密码(这部分的完成非常感谢这里的另一个线程)。

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

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

我将脚本设置为一系列嵌套的 if 语句,这些语句向下运行,消除了出现的可能性——即,如果大小合适但其他地方有问题,则进入下一个“级别”;如果尺寸错误但其他一切都很好,则回显尺寸错误等。

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

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

回声 $1 | grep -o "[@#$%&*-=+]" | wc -l

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

有什么建议吗?

【问题讨论】:

    标签: string bash comparison


    【解决方案1】:

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

    $ echo :/, | grep -o "[@#$%&*-=+]" | wc -l
    3
    $ echo :/, | grep -o "[@#$%&*=+-]" | wc -l
    0
    $ echo :/, | grep -o "[-@#$%&*=+]" | wc -l
    0
    

    【讨论】:

    • 太棒了。当在 if 语句中作为 $(echo... | grep... | wc -l) 完成时,这实际上非常有效。非常感谢!
    【解决方案2】:

    对于它仍然有价值的东西,这里有一个解决方案,所有检查都运行一个进程。

    对于 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
    

    【讨论】:

    • 谢谢,尽管由于我的愚蠢问题,我最终不得不重新编写整个脚本。结果是我的剧本曾经有超过 300 个字符,但现在我已经把它缩减到可能不到一百个。它不是向下工作,而是只检查一个嵌套 if 语句中的所有条件,该语句检查 $1 是否不为空。如果 $1 不为空,它会检查一个接一个的条件并在执行过程中回显错误。
    【解决方案3】:
    $ 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2016-04-04
      • 2014-04-24
      相关资源
      最近更新 更多