bash脚本测试字符串上多个参数的条件

时间:2018-10-13 09:03:36

标签: linux bash shell

我正在研究一个bash shell脚本,该脚本测试一个字符串并为以下内容返回true:

1)至少8个字符

2)至少有一个字母和一个数字

3)同时具有小写字母和大写字母

通过搜索,我确实找到了如何获取字符串中的字符数

srtLen=$(echo -m $str | wc -m)

而if语句将

if [ $strLen -ge 8 ]; then
  #make bool var true
fi

但是我无法找到如何测试和返回布尔值的方式,例如字符串是否包含小写字母,大写字母和至少一个数字。我不在乎每个测试是否分开,我想它们会在if语句中分开,这就是为什么我在代码中提到了将根据条件设置的布尔变量上方的原因。

2 个答案:

答案 0 :(得分:1)

这是英语字母,如果您需要其他字母,则需要弄乱语言环境和变量Runtime Error Uncaught (in promise): navigation stack needs at least one root page Stack Error: Uncaught (in promise): navigation stack needs at least one root page at c (http://192.168.43.214:8100/build/polyfills.js:3:19752) at Object.reject (http://192.168.43.214:8100/build/polyfills.js:3:19174) at NavControllerBase._fireError (http://192.168.43.214:8100/build/vendor.js:53087:16) at NavControllerBase._failed (http://192.168.43.214:8100/build/vendor.js:53080:14) at http://192.168.43.214:8100/build/vendor.js:53127:59 at t.invoke (http://192.168.43.214:8100/build/polyfills.js:3:14976) at Object.onInvoke (http://192.168.43.214:8100/build/vendor.js:5134:33) at t.invoke (http://192.168.43.214:8100/build/polyfills.js:3:14916) at r.run (http://192.168.43.214:8100/build/polyfills.js:3:10143) at http://192.168.43.214:8100/build/polyfills.js:3:20242

LC_COLLATE

试运行:

check_str()
{   
    str="$1"

    # Has a minimum of 8 characters
    if (( ${#str} > 7 )) &&

       # Has at least one number
       [[ "$str" = *[0-9]* ]] &&

       # Has both a lowercase 
       [[ "$str" = *[a-z]* ]] &&
       # and uppercase letter
       [[ "$str" = *[A-Z]* ]]
    then
        return 0
    else
        return 1
    fi
}

while :
do
    read -p "Enter a string: " inp
    if check_str "$inp"
    then
        echo "$str matches"
    else
        echo "$str does not match"
    fi
done

请注意,您的条件2和3重叠,对于2,我们只需要检查是否有数字,则在3中检查是否存在字母。

答案 1 :(得分:1)

这是一个通用答案,适用于非英语语言环境和多字节UTF-8字符。

让我们将您的每个要求翻译成bash代码:

  1. $str(至少8个字符):可以使用bash内置函数以几种简单的方式完成

    • [ "${#str}" -ge 8 ] && echo "str has a minimum of 8 characters"

      简单明了:我们比较$str

    • 的长度
    • [[ "$str" == ????????* ]] && echo "str has a minimum of 8 characters"

      $str已根据至少匹配8个字符的模式进行检查

    • [[ "$str" =~ .{8} ]] && echo "str has a minimum of 8 characters"

      根据与8个字符串匹配的正则表达式检查

      $str

    • [ -n "${str#???????}" ] && echo "str has a minimum of 8 characters"

      删除前7个字符后,我们检查$str是否为空(不明显,应避免)

  2. 具有至少一位数字:

    • [[ "$str" == *[[:digit:]]* ]] && echo "str has at least one digit"

      $str是根据与任意数量的字符包围的数字匹配的模式进行检查的

    • [[ "$str" =~ [[:digit:]] ]] && echo "str has at least one digit"

      $str根据与一位数字匹配的正则表达式进行检查

    • [ -n "${str//[^[:digit:]]}" ] && echo "str has at least one digit"

      当所有非数字字符都被删除时,我们检查$str是否为空(不明显,应避免)

  3. 至少有一个小写字母:

    与数字相同,只需将[[:digit:]]替换为[[:lower:]]

    [[ "$str" == *[[:lower:]]* ]] && echo "str has at least one lowercase letter"
    [[ "$str" =~ [[:lower:]] ]] && echo "str has at least one lowercase letter"
    [ -n "${str//[^[:lower:]]}" ] && echo "str has at least one lowercase letter"
    
  4. 至少有一个大写字母:

    与数字相同,只需将[[:digit:]]替换为[[:upper:]]

    [[ "$str" == *[[:upper:]]* ]] && echo "str has at least one uppercase letter"
    [[ "$str" =~ [[:upper:]] ]] && echo "str has at least one uppercase letter"
    [ -n "${str//[^[:upper:]]}" ] && echo "str has at least one uppercase letter"
    

您当然可以结合以下四个条件:

$ str='my ßtrÎñ9'
$ if [[ "${#str}" -ge 8 \
    && "$str" =~ [[:digit:]] \
    && "$str" =~ [[:lower:]] \
    && "$str" =~ [[:upper:]] \
  ]]; then
      echo "str is a valid password"
  else
      echo "str is NOT a valid password"
  fi

str is a valid password