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



我正在开发一个 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 语句中,这就是为什么我在上面的代码中提到了一个将根据条件设置的布尔变量。

这是一个通用答案,适用于非英语区域设置和多字节 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"

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

    • [[ "$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

这是针对英文字母表的,如果您需要其他字母,则需要弄乱语言环境和变量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

试运转:

Enter a string: helloHHx
helloHHx does not match
Enter a string: helloH1x
helloH1x matches
Enter a string: 12345678
12345678 does not match
Enter a string: hello
hello does not match
Enter a string: now is The 4 time for all good men
now is The 4 time for all good men matches

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

最新更新