#!/bin/bash

# ================= 配置区域 =================
SCRIPT_URL="https://eocdn.foambk.top/tz/official-go/install.sh"
BASE_URL="https://eocdn.foambk.top/tz/official-go"
INSTALL_DIR="/opt/monitor"
SERVICE_NAME="monitor-client"
CLI_CMD="bktzc"
# ===========================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
SKYBLUE='\033[0;36m'
PLAIN='\033[0m'

# 检查 Root 权限
[[ $EUID -ne 0 ]] && echo -e "${RED}错误: 必须使用 root 用户运行此脚本！${PLAIN}" && exit 1

# ================= 检测架构 =================
detect_arch() {
    ARCH=$(uname -m)
    case "$ARCH" in
        x86_64|amd64)   BINARY_NAME="monitor-client-linux-amd64" ;;
        aarch64|arm64)   BINARY_NAME="monitor-client-linux-arm64" ;;
        armv7l|armhf)
            echo -e "${RED}❌ 不支持 32 位 ARM，请使用 64 位系统${PLAIN}"; exit 1 ;;
        *)
            echo -e "${RED}❌ 不支持的架构: $ARCH${PLAIN}"; exit 1 ;;
    esac
}

# ================= 检测 init 系统 =================
detect_init() {
    if [ -d /run/systemd/system ] && command -v systemctl &>/dev/null; then
        INIT_SYSTEM="systemd"
    elif command -v rc-service &>/dev/null && [ -d /etc/init.d ]; then
        INIT_SYSTEM="openrc"
    else
        INIT_SYSTEM="none"
    fi
}

# ================= 服务管理函数 =================
service_start() {
    case "$INIT_SYSTEM" in
        systemd)  systemctl start "$SERVICE_NAME" ;;
        openrc)   rc-service "$SERVICE_NAME" start ;;
        none)     nohup "${INSTALL_DIR}/${BINARY_NAME}" > /dev/null 2>&1 & ;;
    esac
}

service_stop() {
    case "$INIT_SYSTEM" in
        systemd)  systemctl stop "$SERVICE_NAME" ;;
        openrc)   rc-service "$SERVICE_NAME" stop ;;
        none)     pkill -f "${INSTALL_DIR}/${BINARY_NAME}" 2>/dev/null ;;
    esac
}

service_restart() {
    case "$INIT_SYSTEM" in
        systemd)  systemctl restart "$SERVICE_NAME" ;;
        openrc)   rc-service "$SERVICE_NAME" restart ;;
        none)
            pkill -f "${INSTALL_DIR}/${BINARY_NAME}" 2>/dev/null
            sleep 1
            cd "$INSTALL_DIR" && nohup "./${BINARY_NAME}" > /dev/null 2>&1 &
            ;;
    esac
}

service_is_active() {
    case "$INIT_SYSTEM" in
        systemd)  systemctl is-active --quiet "$SERVICE_NAME" 2>/dev/null ;;
        openrc)   rc-service "$SERVICE_NAME" status 2>/dev/null | grep -q "started" ;;
        none)     pgrep -f "${BINARY_NAME}" > /dev/null 2>&1 ;;
    esac
}

service_enable() {
    case "$INIT_SYSTEM" in
        systemd)  systemctl enable "$SERVICE_NAME" ;;
        openrc)   rc-update add "$SERVICE_NAME" default ;;
        none)     setup_rc_local ;;
    esac
}

setup_rc_local() {
    if [ -f /etc/rc.local ]; then
        if ! grep -q "${INSTALL_DIR}/${BINARY_NAME}" /etc/rc.local; then
            sed -i "/^exit 0/i cd ${INSTALL_DIR} && nohup ./${BINARY_NAME} > /dev/null 2>&1 &" /etc/rc.local
        fi
    fi
}

# ================= 创建服务文件 =================
create_service() {
    case "$INIT_SYSTEM" in
        systemd)
            cat > /etc/systemd/system/${SERVICE_NAME}.service <<EOF
[Unit]
Description=Monitor Client
After=network.target

[Service]
Type=simple
ExecStart=${INSTALL_DIR}/${BINARY_NAME}
WorkingDirectory=${INSTALL_DIR}
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF
            systemctl daemon-reload
            ;;
        openrc)
            cat > /etc/init.d/${SERVICE_NAME} <<EOF
#!/sbin/openrc-run

name="${SERVICE_NAME}"
description="Monitor Client"
command="${INSTALL_DIR}/${BINARY_NAME}"
command_background=true
pidfile="/run/${SERVICE_NAME}.pid"
directory="${INSTALL_DIR}"

depend() {
    need net
    after firewall
}
EOF
            chmod +x /etc/init.d/${SERVICE_NAME}
            ;;
        none)
            ;;
    esac
}

# ================= 删除服务文件 =================
remove_service() {
    case "$INIT_SYSTEM" in
        systemd)
            systemctl stop "$SERVICE_NAME" >/dev/null 2>&1
            systemctl disable "$SERVICE_NAME" >/dev/null 2>&1
            rm -f /etc/systemd/system/${SERVICE_NAME}.service
            systemctl daemon-reload
            ;;
        openrc)
            rc-service "$SERVICE_NAME" stop >/dev/null 2>&1
            rc-update del "$SERVICE_NAME" default >/dev/null 2>&1
            rm -f /etc/init.d/${SERVICE_NAME}
            ;;
        none)
            pkill -f "${INSTALL_DIR}/${BINARY_NAME}" 2>/dev/null
            if [ -f /etc/rc.local ]; then
                sed -i '/monitor-client/d' /etc/rc.local
                sed -i '/Monitor Client/d' /etc/rc.local
            fi
            ;;
    esac
}

# ================= 停止旧版 Python 服务 =================
stop_python_service() {
    case "$INIT_SYSTEM" in
        systemd)
            systemctl stop "$SERVICE_NAME" >/dev/null 2>&1
            systemctl disable "$SERVICE_NAME" >/dev/null 2>&1
            rm -f /etc/systemd/system/${SERVICE_NAME}.service
            systemctl daemon-reload
            ;;
        openrc)
            rc-service "$SERVICE_NAME" stop >/dev/null 2>&1
            rc-update del "$SERVICE_NAME" default >/dev/null 2>&1
            rm -f /etc/init.d/${SERVICE_NAME}
            ;;
        none)
            pkill -f "python3.*client.py" 2>/dev/null
            pkill -f "python.*client.py" 2>/dev/null
            if [ -f /etc/rc.local ]; then
                sed -i '/client.py/d' /etc/rc.local
            fi
            ;;
    esac
}

# ================= 隐藏的自动升级逻辑 =================
if [ "$1" == "--continue-update" ]; then
    detect_arch
    detect_init
    echo -e "\n${YELLOW}=== 正在升级客户端 ===${PLAIN}"

    OLD_CFG=""
    if [ -f "${INSTALL_DIR}/config.json" ]; then
        OLD_CFG=$(cat "${INSTALL_DIR}/config.json")
    fi

    echo -e "${SKYBLUE}正在下载 $BINARY_NAME ...${PLAIN}"
    curl -k -sL -o "/tmp/${BINARY_NAME}" "${BASE_URL}/${BINARY_NAME}"

    if [ ! -f "/tmp/${BINARY_NAME}" ] || [ "$(stat -c%s "/tmp/${BINARY_NAME}" 2>/dev/null)" -lt 1000000 ]; then
        echo -e "${RED}❌ 下载失败${PLAIN}"
        exit 1
    fi

    service_stop
    mv -f "/tmp/${BINARY_NAME}" "${INSTALL_DIR}/${BINARY_NAME}"
    chmod +x "${INSTALL_DIR}/${BINARY_NAME}"

    if [ -n "$OLD_CFG" ]; then
        echo "$OLD_CFG" > "${INSTALL_DIR}/config.json"
        echo -e "${GREEN}✅ 配置已保留${PLAIN}"
    fi

    create_service
    service_start
    echo -e "\n${GREEN}✅ 客户端已完成升级！${PLAIN}"
    exit 0
fi

# ================= 函数：安装客户端 =================
install_monitor() {
    detect_arch
    detect_init

    echo -e "${SKYBLUE}检测到架构: $ARCH | init 系统: $INIT_SYSTEM${PLAIN}"

    # 1. 冲突检测
    if [ -f "${INSTALL_DIR}/${BINARY_NAME}" ]; then
        echo -e "\n${RED}⚠️  系统已安装过客户端！${PLAIN}"
        echo -e "${YELLOW}重新安装将覆盖配置，建议使用 [2. 更新客户端]${PLAIN}"
        read -p "确定要继续重新安装吗？[y/N]: " re_confirm
        [[ "$re_confirm" != "y" && "$re_confirm" != "Y" ]] && return
        service_stop
    fi

    # 2. 配置输入
    echo -e "\n${YELLOW}=== 配置上报信息 ===${PLAIN}"
    read -p "请输入服务端域名 (例如 monitor.abc.com): " S_IP
    read -p "请输入服务端生成的 Token: " S_TOKEN
    [[ -z "$S_IP" || -z "$S_TOKEN" ]] && { echo -e "${RED}输入不能为空！${PLAIN}"; return; }

    # 3. 下载二进制
    mkdir -p "${INSTALL_DIR}"
    echo -e "\n${YELLOW}=== 下载客户端 ===${PLAIN}"
    echo -e "${SKYBLUE}正在下载 $BINARY_NAME ...${PLAIN}"

    curl -k -sL -o "${INSTALL_DIR}/${BINARY_NAME}" "${BASE_URL}/${BINARY_NAME}"

    if [ ! -f "${INSTALL_DIR}/${BINARY_NAME}" ] || [ "$(stat -c%s "${INSTALL_DIR}/${BINARY_NAME}" 2>/dev/null)" -lt 1000000 ]; then
        echo -e "${RED}❌ 下载失败，请检查网络${PLAIN}"
        return
    fi

    chmod +x "${INSTALL_DIR}/${BINARY_NAME}"
    echo -e "${GREEN}✅ 下载完成${PLAIN}"

    # 4. 写入配置
    cat > "${INSTALL_DIR}/config.json" << EOF
{
    "server_ip": "${S_IP}",
    "server_token": "${S_TOKEN}"
}
EOF
    echo -e "${GREEN}✅ 配置已写入${PLAIN}"

    # 5. 创建服务 + 启动
    create_service

    cp -f "$0" "/usr/local/bin/${CLI_CMD}"
    chmod +x "/usr/local/bin/${CLI_CMD}"

    service_enable
    service_start

    sleep 2
    if service_is_active; then
        echo -e "\n${GREEN}✅ 客户端安装成功并已启动！${PLAIN}"
        echo -e "架构: ${SKYBLUE}${ARCH}${PLAIN}"
        echo -e "init: ${SKYBLUE}${INIT_SYSTEM}${PLAIN}"
        echo -e "域名: ${SKYBLUE}${S_IP}${PLAIN}"
        echo -e "管理命令: ${GREEN}${CLI_CMD}${PLAIN}"
    else
        echo -e "\n${RED}❌ 启动失败！${PLAIN}"
        case "$INIT_SYSTEM" in
            systemd) echo -e "  查看日志: ${YELLOW}journalctl -u ${SERVICE_NAME} -n 20${PLAIN}" ;;
            openrc)  echo -e "  查看日志: ${YELLOW}cat /var/log/messages | tail -20${PLAIN}" ;;
            none)    echo -e "  手动运行: ${YELLOW}cd ${INSTALL_DIR} && ./${BINARY_NAME}${PLAIN}" ;;
        esac
    fi
    read -p "按回车键继续..."
}

# ================= 功能：更新 =================
upgrade_flow() {
    if [ ! -f "${INSTALL_DIR}/monitor-client-linux-amd64" ] && [ ! -f "${INSTALL_DIR}/monitor-client-linux-arm64" ]; then
        echo -e "${RED}未检测到安装！${PLAIN}"; read -p "回车返回..."; return
    fi

    echo -e "\n${YELLOW}=== 1. 正在更新管理脚本 ===${PLAIN}"
    curl -s -k -L "$SCRIPT_URL" -o /tmp/install_new.sh
    if [ $? -eq 0 ] && [ -s /tmp/install_new.sh ]; then
        mv -f /tmp/install_new.sh "/usr/local/bin/${CLI_CMD}"
        chmod +x "/usr/local/bin/${CLI_CMD}"
        echo -e "${GREEN}脚本更新完成！正在更新客户端...${PLAIN}"
        exec "/usr/local/bin/${CLI_CMD}" --continue-update
    else
        echo -e "${RED}更新脚本失败${PLAIN}"
        read -p "按回车继续..."
    fi
}

# ================= 功能：nohup 启动客户端 =================
start_nohup() {
    detect_arch

    if [ ! -f "${INSTALL_DIR}/${BINARY_NAME}" ]; then
        echo -e "${RED}未检测到客户端，请先安装！${PLAIN}"
        read -p "按回车返回..."; return
    fi

    if pgrep -f "${INSTALL_DIR}/${BINARY_NAME}" > /dev/null 2>&1; then
        echo -e "${YELLOW}客户端已在运行中 (PID: $(pgrep -f "${INSTALL_DIR}/${BINARY_NAME}"))${PLAIN}"
        read -p "是否先停止再重启？[y/N]: " confirm_re
        if [[ "$confirm_re" == "y" || "$confirm_re" == "Y" ]]; then
            pkill -f "${INSTALL_DIR}/${BINARY_NAME}" 2>/dev/null
            sleep 1
        else
            read -p "按回车返回..."; return
        fi
    fi

    nohup "${INSTALL_DIR}/${BINARY_NAME}" > /var/log/monitor-client.log 2>&1 &
    sleep 1

    if pgrep -f "${INSTALL_DIR}/${BINARY_NAME}" > /dev/null 2>&1; then
        echo -e "\n${GREEN}✅ nohup 启动成功！${PLAIN}"
        echo -e "PID: ${SKYBLUE}$(pgrep -f "${INSTALL_DIR}/${BINARY_NAME}")${PLAIN}"
        echo -e "日志: ${SKYBLUE}/var/log/monitor-client.log${PLAIN}"
        echo -e "${YELLOW}提示: nohup 启动在容器重启后不会自动恢复，请配合 [11. 设置 rc.local 自启] 使用${PLAIN}"
    else
        echo -e "\n${RED}❌ 启动失败，请查看日志:${PLAIN}"
        cat /var/log/monitor-client.log 2>/dev/null
    fi
    read -p "按回车返回..."
}

# ================= 功能：设置 rc.local 自启 =================
setup_rc_local_menu() {
    detect_arch

    if [ ! -f "${INSTALL_DIR}/${BINARY_NAME}" ]; then
        echo -e "${RED}未检测到客户端，请先安装！${PLAIN}"
        read -p "按回车返回..."; return
    fi

    echo -e "\n${YELLOW}=== 设置 rc.local 开机自启 ===${PLAIN}"

    # 1. 创建启动脚本
    cat > "${INSTALL_DIR}/start-monitor.sh" << 'STARTEOF'
#!/bin/bash
CLIENT="__BINARY_PATH__"
LOG="/var/log/monitor-client.log"
if pgrep -f "$CLIENT" > /dev/null 2>&1; then
    echo "monitor-client 已在运行，跳过"
    exit 0
fi
nohup "$CLIENT" >> "$LOG" 2>&1 &
echo "monitor-client 已启动 PID: $!"
STARTEOF

    # 替换实际路径
    sed -i "s|__BINARY_PATH__|${INSTALL_DIR}/${BINARY_NAME}|g" "${INSTALL_DIR}/start-monitor.sh"
    chmod +x "${INSTALL_DIR}/start-monitor.sh"
    echo -e "${GREEN}✅ 启动脚本已创建: ${INSTALL_DIR}/start-monitor.sh${PLAIN}"

    # 2. 写入 rc.local
    if [ -f /etc/rc.local ]; then
        if grep -q "${INSTALL_DIR}/start-monitor.sh" /etc/rc.local; then
            echo -e "${YELLOW}rc.local 中已存在自启配置，跳过${PLAIN}"
        else
            sed -i "/^exit 0/i ${INSTALL_DIR}/start-monitor.sh" /etc/rc.local
            echo -e "${GREEN}✅ 已写入 /etc/rc.local${PLAIN}"
        fi
    else
        cat > /etc/rc.local << RCEOF
#!/bin/bash
${INSTALL_DIR}/start-monitor.sh
exit 0
RCEOF
        chmod +x /etc/rc.local
        echo -e "${GREEN}✅ 已创建 /etc/rc.local${PLAIN}"
    fi

    # 3. 尝试写入 cron @reboot
    if command -v crontab &>/dev/null; then
        if crontab -l 2>/dev/null | grep -q "start-monitor.sh"; then
            echo -e "${YELLOW}crontab 中已存在自启配置，跳过${PLAIN}"
        else
            (crontab -l 2>/dev/null; echo "@reboot ${INSTALL_DIR}/start-monitor.sh") | crontab -
            echo -e "${GREEN}✅ 已添加 crontab @reboot${PLAIN}"
        fi
    else
        echo -e "${YELLOW}⚠ crontab 未安装，跳过 cron 方式（rc.local 方式已生效）${PLAIN}"
    fi

    echo -e "\n${GREEN}=== 自启设置完成 ===${PLAIN}"
    echo -e "启动脚本: ${SKYBLUE}${INSTALL_DIR}/start-monitor.sh${PLAIN}"
    echo -e "自启方式: ${SKYBLUE}rc.local$(command -v crontab &>/dev/null && echo ' + crontab')${PLAIN}"
    echo -e "${YELLOW}提示: 容器环境需 Pod 重建时 rc.local 能被触发才会生效${PLAIN}"
    read -p "按回车返回..."
}

# ================= 功能：修改配置 =================
edit_config() {
    if [ ! -f "${INSTALL_DIR}/config.json" ]; then
        echo -e "${RED}未检测到配置文件！${PLAIN}"; read -p "回车返回..."; return
    fi

    echo -e "\n${YELLOW}=== 当前配置 ===${PLAIN}"
    cat "${INSTALL_DIR}/config.json"
    echo ""

    echo -e "\n${YELLOW}=== 修改配置 ===${PLAIN}"
    read -p "请输入新域名 (留空不修改): " NEW_IP
    read -p "请输入新 Token (留空不修改): " NEW_TOKEN

    if [ -z "$NEW_IP" ] && [ -z "$NEW_TOKEN" ]; then
        echo -e "${YELLOW}未做任何修改${PLAIN}"
        read -p "按回车返回..."; return
    fi

    CUR_IP=$(grep -o '"server_ip"[[:space:]]*:[[:space:]]*"[^"]*"' "${INSTALL_DIR}/config.json" | awk -F'"' '{print $4}')
    CUR_TOKEN=$(grep -o '"server_token"[[:space:]]*:[[:space:]]*"[^"]*"' "${INSTALL_DIR}/config.json" | awk -F'"' '{print $4}')

    [ -z "$NEW_IP" ] && NEW_IP="$CUR_IP"
    [ -z "$NEW_TOKEN" ] && NEW_TOKEN="$CUR_TOKEN"

    cat > "${INSTALL_DIR}/config.json" << EOF
{
    "server_ip": "${NEW_IP}",
    "server_token": "${NEW_TOKEN}"
}
EOF

    detect_init
    service_restart
    echo -e "\n${GREEN}✅ 配置已更新并重启！${PLAIN}"
    echo -e "域名: ${SKYBLUE}${NEW_IP}${PLAIN}"
    read -p "按回车返回..."
}

# ================= 功能：卸载 =================
uninstall_monitor() {
    echo -e "\n${RED}警告：将完全移除监控程序和快捷命令！${PLAIN}"
    read -p "确认卸载吗？[y/N]: " confirm_un
    [[ "$confirm_un" != "y" && "$confirm_un" != "Y" ]] && return

    detect_init
    remove_service
    rm -f "/usr/local/bin/${CLI_CMD}"

    read -p "是否保留设备 ID (避免服务端重复设备)? [y/N]: " KEEP_ID
    if [[ "$KEEP_ID" == "y" || "$KEEP_ID" == "Y" ]]; then
        find "${INSTALL_DIR}" -type f ! -name 'client_id.json' -delete 2>/dev/null
        echo -e "${GREEN}程序已卸载，设备 ID 已保留。${PLAIN}"
    else
        rm -rf "${INSTALL_DIR}"
        echo -e "${GREEN}已彻底移除所有文件。${PLAIN}"
    fi
    read -p "按回车返回..."
}

# ================= 功能：查看信息 =================
show_info() {
    echo -e "\n${YELLOW}=== 客户端信息 ===${PLAIN}"

    detect_init
    echo -e "${SKYBLUE}架构:${PLAIN} $(uname -m)"
    echo -e "${SKYBLUE}init:${PLAIN} $INIT_SYSTEM"
    echo ""

    if [ -f "${INSTALL_DIR}/config.json" ]; then
        echo -e "${SKYBLUE}配置:${PLAIN}"
        cat "${INSTALL_DIR}/config.json"
        echo ""
    fi

    if [ -f "${INSTALL_DIR}/client_id.json" ]; then
        echo -e "${SKYBLUE}设备ID:${PLAIN}"
        cat "${INSTALL_DIR}/client_id.json"
        echo ""
    fi

    if [ -f "${INSTALL_DIR}/client.log" ]; then
        echo -e "${SKYBLUE}最近日志:${PLAIN}"
        tail -5 "${INSTALL_DIR}/client.log"
    fi

    echo ""
    read -p "按回车返回..."
}

# ================= 主菜单 =================
show_menu() {
    while true; do
        clear
        detect_arch
        detect_init

        echo -e "${GREEN}################################################${PLAIN}"
        echo -e "${GREEN}#          监控客户端管理 (Go 版)               #${PLAIN}"
        echo -e "${GREEN}################################################${PLAIN}"
        echo -e " ${SKYBLUE}架构:${PLAIN} $(uname -m) | ${SKYBLUE}init:${PLAIN} $INIT_SYSTEM"
        echo ""

        if service_is_active; then
            echo -e " ${YELLOW}服务状态:${PLAIN} ${GREEN}▶ 运行中${PLAIN}"
        elif [ -f "${INSTALL_DIR}/monitor-client-linux-amd64" ] || [ -f "${INSTALL_DIR}/monitor-client-linux-arm64" ] || [ -f "${INSTALL_DIR}/client.py" ]; then
            echo -e " ${YELLOW}服务状态:${PLAIN} ${RED}■ 已停止${PLAIN}"
        else
            echo -e " ${YELLOW}服务状态:${PLAIN} ${SKYBLUE}未安装${PLAIN}"
        fi

        echo ""
        echo -e " ${GREEN}1.${PLAIN} 安装客户端 (Go 版)"
        echo -e " ${GREEN}2.${PLAIN} 更新客户端"
        echo -e " ${GREEN}3.${PLAIN} 启动客户端"
        echo -e " ${GREEN}4.${PLAIN} 停止客户端"
        echo -e " ${GREEN}5.${PLAIN} 重启客户端"
        echo -e " ${GREEN}6.${PLAIN} 查看实时日志"
        echo -e " ${GREEN}7.${PLAIN} 修改配置 (域名/Token)"
        echo -e " ${GREEN}8.${PLAIN} 查看客户端信息"
        echo -e " ${GREEN}9.${PLAIN} 彻底卸载客户端"
        echo -e " ${GREEN}10.${PLAIN} ${YELLOW}nohup 启动客户端${PLAIN}"
        echo -e " ${GREEN}11.${PLAIN} ${YELLOW}设置 rc.local 自启脚本${PLAIN}"
        echo -e " ${GREEN}0.${PLAIN} 退出控制台"
        echo ""
        read -p " 请输入指令 [0-11]: " num

        case "$num" in
            1) install_monitor ;;
            2) upgrade_flow ;;
            3) service_start && echo -e "${GREEN}启动完成${PLAIN}"; sleep 1 ;;
            4) service_stop && echo -e "${YELLOW}停止完成${PLAIN}"; sleep 1 ;;
            5) service_restart && echo -e "${GREEN}重启完成${PLAIN}"; sleep 1 ;;
            6)
                echo -e "${SKYBLUE}提示: 按 Ctrl+C 退出${PLAIN}"
                if [ "$INIT_SYSTEM" = "systemd" ]; then
                    journalctl -u ${SERVICE_NAME} -f
                elif [ -f "${INSTALL_DIR}/client.log" ]; then
                    tail -f "${INSTALL_DIR}/client.log"
                elif [ -f "/var/log/monitor-client.log" ]; then
                    tail -f "/var/log/monitor-client.log"
                else
                    echo -e "${RED}无日志可查看${PLAIN}"; sleep 2
                fi ;;
            7) edit_config ;;
            8) show_info ;;
            9) uninstall_monitor ;;
            10) start_nohup ;;
            11) setup_rc_local_menu ;;
            0) exit 0 ;;
            *) echo -e "${RED}指令错误！${PLAIN}" ; sleep 1 ;;
        esac
    done
}

trap "echo -e '\n已退出'; exit 0" SIGINT
show_menu