介绍
模拟功能:登录、查询、提现、转账、存款、清屏、退出
登录次数限制:3次错误强制退出程序
登录用户1:zzp/123
登录用户2:cj/456
执行效果
[root@k8s-master01 shell]# sh qukuan.sh
-------------- 中国银行自助服务系统 --------------
请输入您的账户名>>> zzp
请输入取款密码>>> # 输入1234
密码输入错误,还剩2次机会!
请输入您的账户名>>> zzp
请输入取款密码>>> # 输入123
正在验证用户···
用户“ZhangZhenPeng”登陆成功!正在进入您的个人账户,请稍后···
1) 查询余额
2) 提现
3) 转账
4) 存款
5) 清屏
6) 退出
按下回车键查看功能编号>>> 1
正在查询您的账户余额,请稍后···
您的账户余额为6000000元
按下回车键查看功能编号>>> 2
请输入提款金额>>>10000
正在为您提款,请稍后...
已成功提款10000元,请取钞。
当前账户余额还剩5990000元。
按下回车键查看功能编号>>> 3
请输入对方银行卡号或手机号>>>00000
正在核对验证用户“00000”的账户信息,请稍后...
您要转账的用户为“一夜暴富”,是否继续转账?(输入(Y/N)选择)>>> y
请输入转账金额>>> 15
请放入面值为100元人民币
请输入转账金额>>> 1000
正在处理请稍后···
正在汇款给“一夜暴富”,请稍后···
已成功向对方汇款1000元(人民币)!
当前账户余额为5989000元
正在返回主菜单,请稍后···
按下回车键查看功能编号>>> 4
请将钞票摆放整齐放置存款口>>> 15
请放入面值为100元人民币
请将钞票摆放整齐放置存款口>>> 1000
正在为您存款,请稍后...
已成功存款1000元!正在为您查询当前账户余额,请稍等...
当前账户余额还剩5990000元,3秒后返回主菜单···
当前账户余额还剩5990000元,2秒后返回主菜单···
当前账户余额还剩5990000元,1秒后返回主菜单···
1) 继续存款
2) 返回主菜单
请选择操作>>> 2
1) 查询余额
2) 提现
3) 转账
4) 存款
5) 清屏
6) 退出
请选择操作>>> 6
[root@k8s-master01 shell]#
脚本
两个版本:
普通版:未使用函数将每隔功能单独分割
优化版:增加部分操作成功/失败
彩色提示打印+使用函数将每个功能单独分割,便于阅读
普通版
qukuan.sh
:
直接复制脚本执行即可测试效果~
PS:输入密码时使用了-s
选项,界面不会显示密码
#!/bin/bash
declare -A name
name=(["zzp"]="123" ["cj"]="456")
declare -A ming
ming=(["zzp"]="ZhangZhenPeng" ["cj"]="CuiJian")
function LOGIN() {
for i in {1..4}; do
if [ $i == 4 ]; then
echo "已错误登录超过三次,为了保护您的财产安全,账户已被锁定!请咨询客服进行解锁。" && exit
fi
read -p "请输入您的账户名>>> " user
read -sp "请输入取款密码>>> " pwd
if [[ -z $user || -z $pwd ]]; then
echo "用户名或密码不能为空,错误输入$((3 - $i))次将自动退出银行系统!请重新输入~" && continue
fi
# 开启此判断会登陆失败
#if [[ ! $user =~ [a-Z0-9]+ || ! $pwd =~ [a-Z0-9]+ ]];then
# echo "用户名或密码不能为空,必须是以字母或数字的组合~" && continue
#fi
for uname in ${!name[*]}; do
#echo $uname ${name[$user]} $user $pwd ${ming[$user]}
if [[ "$user" == "$uname" && "$pwd" == "${name[$user]}" ]]; then
echo "正在验证用户···" && sleep 0.5
echo "用户“${ming[$user]}”登陆成功!正在进入您的个人账户,请稍后···" && sleep 0.5 && break 2
fi
done
if [[ "$user" != "$uname" || "$pwd" != "${name[$user]}" ]]; then
echo "密码输入错误,还剩$((3 - $i))次机会!"
if [[ "$user" != "$uname" ]]; then
echo "当前用户未注册,请注册后登陆!"
continue
fi
continue
else
echo "用户名或密码输入错误,请重新输入,还剩$((3 - $i))次机会!"
continue
fi
break
done
break
}
function MENU() {
PS3='按下回车键查看功能编号>>> '
yue=6000000
select choice in {"查询余额","提现","转账","存款","清屏","退出"}; do
for ((i = 1; i < 4; i++)); do
case $choice in
"查询余额")
echo "正在查询您的账户余额,请稍后···" && sleep 0.5
echo "您的账户余额为$yue元" && break
;;
"提现")
sleep 0.5
read -p "请输入提款金额>>> " rmb
if [[ $rmb -gt $yue ]]; then
echo "余额不足!" && continue
elif [[ $rmb =~ ^[0-9]+$ ]]; then
let "yue = $yue - $rmb"
echo "正在为您提款,请稍后..." && sleep 0.5
echo "已成功提款$rmb元,请取钞。" && sleep 0.5
echo "当前账户余额还剩$yue元。" && break
else
echo "仅支持阿拉伯数字,请重新输入~" && continue
fi
;;
"转账")
sleep 0.5
read -p "请输入对方银行卡号或手机号>>> " num
while :; do
if [[ $num =~ ^[0-9]+$ ]]; then
echo "正在核对验证用户“$num”的账户信息,请稍后..." && sleep 0.5
while :; do
read -p "您要转账的用户为“一夜暴富”,是否继续转账?(输入(Y/N)选择)>>> " choice
if [[ $choice == "y" || $choice == "Y" ]]; then
while :; do
read -p "请输入转账金额>>> " rmb
if [[ $rmb == 0 ]]; then
echo "金额错误"
continue
fi
[[ -z $rmb ]] && echo "不能为空~" && continue
[[ $(($rmb % 100)) != 0 ]] && echo "请放入面值为100元人民币" && continue
if [[ $rmb =~ ^[0-9]+$ ]]; then
sleep 0.5
echo "正在处理请稍后···"
echo "正在汇款给“一夜暴富”,请稍后···" && sleep 0.5
echo "已成功向对方汇款$rmb元(人民币)!" && sleep 0.5
let "yue = $yue - $rmb"
echo "当前账户余额为$yue元" && sleep 0.5
echo "正在返回主菜单,请稍后···" && break
else
echo "金额输入仅支持阿拉伯数字,请重新输入转账金额~" && continue
fi
done
break
elif [[ $choice == "n" || $choice == "N" ]]; then
echo "您已取消转账!正在返回主菜单,请稍后···" && sleep 0.5 && break
else
continue
fi
done
break
else
echo "仅支持阿拉伯数字,请重新输入~" && break
fi
done
;;
"存款")
while :; do
sleep 0.5
read -p "请将钞票摆放整齐放置存款口>>> " rmb
[[ -z $rmb ]] && echo "不能为空~" && continue
[[ $(($rmb % 100)) != 0 ]] && echo "请放入面值为100元人民币" && continue
if [[ $rmb =~ ^[0-9]+$ && $rmb -ge 100 ]]; then
let "yue = $yue + $rmb"
echo "正在为您存款,请稍后..." && sleep 0.5
echo "已成功存款$rmb元!正在为您查询当前账户余额,请稍等..." && sleep 0.5 && clear
echo "当前账户余额还剩$yue元,3秒后返回主菜单···" && sleep 1 && clear
echo "当前账户余额还剩$yue元,2秒后返回主菜单···" && sleep 1 && clear
echo "当前账户余额还剩$yue元,1秒后返回主菜单···" && sleep 1 && clear
fi
PS3="请选择操作>>> "
select choice in {"继续存款","返回主菜单"}; do
case $choice in
"继续存款")
continue 2
;;
"返回主菜单")
break 3
;;
esac
done
if [[ $rmb == 0 ]]; then
echo "金额错误"
continue
else
echo "仅支持阿拉伯数字,请重新输入~" && continue
fi
done
break
;;
"清屏")
clear
;;
"退出")
exit
;;
esac
done
done
}
clear
echo "-------------- 中国银行自助服务系统 --------------"
LOGIN
MENU
优化版
qukuan.sh
:
直接复制脚本执行即可测试效果~
PS:输入密码时使用了-s
选项,界面不会显示密码,操作成功/失败
彩色提示打印效果如下:
#!/bin/bash
# 每个函数体为单独的功能,便于查看代码
. /etc/init.d/functions
# 已存在用户列表
declare -A name
name=(["zzp"]="123" ["cj"]="456")
declare -A ming
ming=(["zzp"]="ZhangZhenPeng" ["cj"]="CuiJian")
# 1.1 登录模块
LoginInput(){
read -p "请输入您的账户名>>> " user
read -sp "请输入取款密码>>> " pwd
}
# 1.2登录限制模块
LoginCount4Exit(){
if [ $i == 4 ]; then
action "已错误登录超过三次,为了保护您的财产安全,账户已被锁定!请咨询客服进行解锁。" /bin/false
exit
fi
}
# 1.3 循环登录认证:超过3次强制退出程序
Login(){
for i in {1..4}; do
LoginCount4Exit
LoginInput
# 登录为空:
if [[ -z $user || -z $pwd ]]; then
action "用户名或密码不能为空,错误输入$((3 - $i))次将自动退出银行系统!请重新输入~" /bin/false && continue
fi
# 认证成功:
for uname in ${!name[*]}; do
if [[ "$user" == "$uname" && "$pwd" == "${name[$user]}" ]]; then
echo "正在验证用户···" && sleep 0.5
action "用户“${ming[$user]}”登陆成功!正在进入您的个人账户,请稍后···" /bin/true && sleep 0.5 && break 2
fi
done
# 认证失败:
if [[ "$user" != "$uname" || "$pwd" != "${name[$user]}" ]]; then
action "密码输入错误,还剩$((3 - $i))次机会!" /bin/false
if [[ "$user" != "$uname" ]]; then
echo "当前用户未注册,请注册后登陆!"
continue
fi
continue
else
action "用户名或密码输入错误,请重新输入,还剩$((3 - $i))次机会!" /bin/false
continue
fi
break
done
break
}
# 主功能: 查询余额、提现、转账、存款、清屏、退出
# 2.1 模块: 功能列表
Functions(){
case $choice in
"查询余额")
Step1
;;
"提现")
Step2
;;
"转账")
Step3
;;
"存款")
Step4
;;
"清屏")
Step5
;;
"退出")
Step6
esac
}
# 2.1.1 子模块: 查询余额
Step1(){
echo "正在查询您的账户余额,请稍后···" && sleep 0.5
echo "您的账户余额为$yue元"
exit # 使用break无效,若不退出则打印3次余额
}
# 2.1.2 子模块: 提现
Step2(){
sleep 0.5
read -p "请输入提款金额>>> " rmb
if [[ $rmb -gt $yue ]]; then
action "余额不足!" /bin/false && continue
elif [[ $rmb =~ ^[0-9]+$ ]]; then
let "yue = $yue - $rmb"
echo "正在为您提款,请稍后..." && sleep 0.5
action "已成功提款$rmb元,请取钞。" /bin/true && sleep 0.5
echo "当前账户余额还剩$yue元。" && break
else
echo "仅支持阿拉伯数字,请重新输入~" && continue
fi
}
# 2.1.3 子模块: 转账
Step3(){
sleep 0.5
read -p "请输入对方银行卡号或手机号>>> " num
while :; do
if [[ $num =~ ^[0-9]+$ ]]; then
echo "正在核对验证用户“$num”的账户信息,请稍后..." && sleep 0.5
while :; do
read -p "您要转账的用户为【一夜暴富】,是否继续转账?(输入(Y/N)选择)>>> " choice
if [[ $choice == "y" || $choice == "Y" ]]; then
action ">>>>>>>>>>>>>>>>>> 正在向【一夜暴富】转账 <<<<<<<<<<<<<<<<<<" /bin/true
while :; do
read -p "请输入转账金额>>> " rmb
if [[ $rmb == 0 ]]; then
action "金额错误" /bin/false
continue
fi
[[ -z $rmb ]] && echo "不能为空~" && continue
[[ $(($rmb % 100)) != 0 ]] && echo "请放入面值为100元人民币" && continue
if [[ $rmb =~ ^[0-9]+$ ]]; then
sleep 0.5
echo "正在处理请稍后···"
echo "正在汇款给“一夜暴富”,请稍后···" && sleep 0.5
action "已成功向对方汇款$rmb元(人民币)!" /bin/true && sleep 0.5
let "yue = $yue - $rmb"
echo "当前账户余额为$yue元" && sleep 0.5
echo "正在返回主菜单,请稍后···" && break
else
echo "金额输入仅支持阿拉伯数字,请重新输入转账金额~" && continue
fi
done
break
elif [[ $choice == "n" || $choice == "N" ]]; then
echo "您已取消转账!正在返回主菜单,请稍后···" && sleep 0.5 && break
else
continue
fi
done
break
else
echo "仅支持阿拉伯数字,请重新输入~" && break
fi
done
}
# 2.1.4 子模块: 存款
Step4(){
while :; do
sleep 0.5
read -p "请将钞票摆放整齐放置存款口>>> " rmb
[[ -z $rmb ]] && echo "不能为空~" && continue
[[ $(($rmb % 100)) != 0 ]] && echo "请放入面值为100元人民币" && continue
if [[ $rmb =~ ^[0-9]+$ && $rmb -ge 100 ]]; then
let "yue = $yue + $rmb"
echo "正在为您存款,请稍后..." && sleep 0.5
echo "已成功存款$rmb元!正在为您查询当前账户余额,请稍等..." && sleep 0.5 && clear
echo "当前账户余额还剩$yue元,3秒后返回主菜单···" && sleep 1 && clear
echo "当前账户余额还剩$yue元,2秒后返回主菜单···" && sleep 1 && clear
echo "当前账户余额还剩$yue元,1秒后返回主菜单···" && sleep 1 && clear
fi
PS3="请选择操作>>> "
select choice in {"继续存款","返回主菜单"}; do
case $choice in
"继续存款")
continue 2
;;
"返回主菜单")
break 3
;;
esac
done
if [[ $rmb == 0 ]]; then
echo "金额错误"
continue
else
echo "仅支持阿拉伯数字,请重新输入~" && continue
fi
done
break
}
# 2.1.5 子模块: 清屏
Step5(){
clear
}
# 2.1.6 子模块: 退出
Step6(){
exit
}
Menu() {
PS3='按下回车键查看功能编号>>> '
yue=6000000
select choice in {"查询余额","提现","转账","存款","清屏","退出"};
do
for ((i = 1; i < 4; i++));
do
Functions
done
done
}
clear
echo "-------------- 中国银行自助服务系统 --------------"
Login
Menu
附:数组理解
数组脚本
#!/bin/bash
# 定义用户名:登录名关联姓名
declare -A name
name['zzp']='Paul'
name['cj']='Cuijian'
# 定义密码:登录名关联密码
declare -A password
password['zzp']='123a'
password['cj']='456b'
# 接收用户输入
read -p '用户名>> ' username
read -p '密码>> ' pwd
# 定义:将 login_success 初始化为 false,否则会打印两次登录成功/失败
login_success=false
for DeclareName in ${!password[*]}; do
if [[ $username == $DeclareName && $pwd == ${password[$username]} ]]; then
login_success=true
break
fi
done
if $login_success; then
echo "用户“${name[$username]}”登陆成功!"
else
echo "用户“${name[$username]}”登陆失败!"
fi
执行效果
[root@Centos8 ~]# sh scripts/shuzu.sh
用户名>> zzp
密码>>
用户“Paul”登陆失败!
[root@Centos8 ~]# sh scripts/shuzu.sh
用户名>> zzp
密码>> 123a
用户“Paul”登陆成功!
[root@Centos8 ~]#