You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shell脚本中实现带验证功能的while循环

Shell while循环实现用户名密码校验的正确写法

你贴的代码属于结构残缺状态,缺少while条件定义、输入读取、校验分支的核心逻辑,fi也没有对应的if起始语句,没法直接运行。

做输入校验类的while循环核心思路很简单:只要输入不符合校验规则,就一直停在循环里提示用户重输,直到校验通过再跳出循环执行后续逻辑。

核心语法注意点

  • while循环标准结构为 while [ 判断条件 ]; do 循环逻辑 done,条件成立时会持续执行循环体
  • 读取密码类敏感输入时,要给read命令加-s参数关闭终端回显,避免明文泄露
  • 字符串比较时变量要套双引号,防止用户输入为空时触发语法错误
  • 可以搭配计数器实现最大重试次数限制,避免无限循环

基础版实现(无限重试直到输入正确)

#!/bin/bash
# 预定义正确的账号密码,生产环境可从配置文件/权限服务读取
TARGET_USER="admin"
TARGET_PWD="Shell@2024"
# 初始化校验状态为未通过
auth_pass=0

while [ $auth_pass -eq 0 ]; do
    # 读取用户名
    read -p "请输入用户名:" input_user
    # 读取密码,-s关闭回显
    read -s -p "请输入密码:" input_pwd
    # 密码输入无回显,手动补换行优化显示
    echo -e "\n"

    # 校验逻辑
    if [ "$input_user" = "$TARGET_USER" ] && [ "$input_pwd" = "$TARGET_PWD" ]; then
        echo "身份校验通过"
        auth_pass=1
    else
        echo "用户名或密码错误,请重新输入"
    fi
done

# 校验通过后的业务逻辑写在循环外
echo "即将进入系统主菜单..."

带最大重试次数的版本

如果需要限制用户最多输错3次就直接退出,可以加计数器变量:

#!/bin/bash
TARGET_USER="admin"
TARGET_PWD="Shell@2024"
max_retry=3
retry_num=0
auth_pass=0

while [ $auth_pass -eq 0 ] && [ $retry_num -lt $max_retry ]; do
    read -p "请输入用户名:" input_user
    read -s -p "请输入密码:" input_pwd
    echo -e "\n"

    if [ "$input_user" = "$TARGET_USER" ] && [ "$input_pwd" = "$TARGET_PWD" ]; then
        echo "身份校验通过"
        auth_pass=1
    else
        retry_num=$((retry_num + 1))
        left_cnt=$((max_retry - retry_num))
        if [ $left_cnt -gt 0 ]; then
            echo "校验失败,剩余可重试次数:$left_cnt"
        else
            echo "重试次数已耗尽,程序退出"
            exit 1
        fi
    fi
done

echo "即将进入系统主菜单..."

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 02:33:27