如何在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
相关产品推荐
相关产品推荐

