shell模拟银行取款功能流程脚本

介绍

模拟功能:登录、查询、提现、转账、存款、清屏、退出
登录次数限制: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选项,界面不会显示密码,操作成功/失败彩色提示打印效果如下:

image-20230320161422607

#!/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 ~]#
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋风お亦冷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值