You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Bash脚本密码强度验证:判断密码包含大小写字母的代码问题求助

解决Bash密码强度验证的问题

首先,咱们先搞清楚你原来的代码为什么总是返回false:

你的判断条件是:

if [[ $PASSWORD == ${PASSWORD,,} ]] && [[ $PASSWORD == ${PASSWORD^^} ]]; then
    valid=true
else
    valid=false
fi

这里的${PASSWORD,,}会把密码里所有字母转成小写,${PASSWORD^^}则转成大写。那这两个条件同时成立的情况只有一种:密码里根本没有任何字母(比如全数字、全符号)——因为只有这时候,转小写和转大写后的结果才和原密码完全一样。而只要密码里有任何大写或小写字母,其中一个条件就会不成立,整个if的判断结果就是false,所以valid会被设为false,这显然和你想要的逻辑完全相反!

另外,这段代码完全没检查密码是否包含数字,这也不符合作业要求。

正确的实现方法

要验证密码同时包含大小写字母和数字(每种至少一个),咱们可以分三次检查,或者用正则表达式分别匹配:

方法1:分步检查(直观易懂)

#!/bin/bash

read -s -p "请输入密码: " PASSWORD
echo

# 初始化验证状态为有效
is_valid=true

# 检查是否包含至少一个小写字母
if ! [[ $PASSWORD =~ [a-z] ]]; then
    echo "错误:密码必须包含至少一个小写字母!"
    is_valid=false
fi

# 检查是否包含至少一个大写字母
if ! [[ $PASSWORD =~ [A-Z] ]]; then
    echo "错误:密码必须包含至少一个大写字母!"
    is_valid=false
fi

# 检查是否包含至少一个数字
if ! [[ $PASSWORD =~ [0-9] ]]; then
    echo "错误:密码必须包含至少一个数字!"
    is_valid=false
fi

# 输出结果
if $is_valid; then
    echo "密码验证通过!"
else
    echo "密码不符合要求,请重新输入。"
fi

方法2:合并成一个条件判断

如果你想更简洁,可以把三个条件合并到一个if语句里:

if [[ $PASSWORD =~ [a-z] ]] && [[ $PASSWORD =~ [A-Z] ]] && [[ $PASSWORD =~ [0-9] ]]; then
    echo "密码有效"
else
    echo "密码无效"
fi

为什么不用for循环逐个字符判断?

其实你一开始想的for循环方法也能实现,但用正则表达式会更简洁高效,Bash本身就支持正则匹配,没必要手动遍历每个字符——当然如果作业要求必须用for循环的话,那另当别论,但显然正则的方法更优雅。

内容的提问来源于stack exchange,提问作者Eylon Levi

火山引擎 最新活动