Shell - 交互式脚本

 

 

#!/bin/bash


# ======================================== 配色区 ========================================
# 颜色设置
# \033[0;31m 解析
# \033 ESC,0 普通样式,31 红色,m 结束, RESET=$'\033[0m'重置颜色
# \033 所有Unix Shell都支持. \e bash/zsh 支持, POSIX sh不支持
# 0; 是SGR样式代码,同样的参数有如下
#        - 0 默认样式(关闭加粗/下划线)
#        - 1 加粗/高亮
#        - 4 下划线
#        - 5 闪烁
#        - 7 反显


RED=$'\033[1,31m'
BOLD=$'\033[1m'
BLUE=$'\033[1;34m'
CYAN=$'\033[1;7;36m'
YELLOW=$'\033[1;33m'
YELLOW_AC=$'\033[1;5;33m'
GREEN=$'\033[1;32m'
RESET=$'\033[0m'

STATUS_OK=$'\033[1;32m●\033[0m'
STATUS_WARN=$'\033[1;33m●\033[0m'
STATUS_ERR=$'\033[1;31m\033[5m●\033[0m'
ALERT_INFO=$'\033[1;5;41;97m[ALERT]\033[0m'

 

 

配置区

# ======================================== 配置区 ========================================
# 当前脚本的全路径
SCRIPT_DIR="$(cd "$(dirname $0)" && pwd)"
# 今天的日期
TODAY_DATE=$(date +%Y-%m-%d)

 

样式区

# ======================================== 样式区 ========================================

LINFO(){
    echo "${GREEN}$(date +%H:%M:%S)${RESET} ${BLUE}[INFO] ▶${RESET} $1"
}

LWARN(){
    echo "${GREEN}$(date +%H:%M:%S)${RESET} ${YELLOW}[INFO] ▶${RESET} $1"
}

LERROR(){
    echo "${GREEN}$(date +%H:%M:%S)${RESET} ${RED}[INFO] ▶${RESET} $1"
}


# 分隔符,自动撑满宽度(终端友好)
SEP(){
    printf '%*s\n' "$COLUMNS" '' | tr ' ' '-'
}

TITLE(){
    local title="$1"
    local w=$(tput cols 2>/dev/null || echo 80)
    local pad=$(( (w - ${#title} - 2) / 2 ))
    
    printf '=%.0s' $(seq 1 $pad)
    printf ' %s' "$title"
    printf '=%.0s' $(seq 1 $((w - pad - ${#title} - 2)) )
    echo
}

# 标题居中带颜色
TITLEC(){
    # 标题内容
    local txt="$1"
    # 终端宽度
    local w=$(tput cols 2>/dev/null || echo 80)
    
    # 左右留1个空格
    local inner=$((w - ${#txt} - 8))
    (( inner < 20 )) && inner=20
    
    local left=$(( inner / 2 ))
    local right=$(( inner - left ))
    
    local lp sp
    printf -v lp '%*s' "$left" ''
    printf -v sp ' %*s' "$right" ''
    
    printf '%b%s %s %s%b\n' "${CYAN}" "$lp" "$txt" "$sp" "${RESET}"
    
}

 

 

 

 

 

 

主方法菜单区

# ======================================== 主方法入口 ========================================
# 交互式脚本方法主入口
func_main(){
    # 开启备用缓冲区
    trap 'printf "\033[?1049l"' EXIT
    # 切换备用缓冲区
    printf "\033[?1049h"
    # 立刻定位光标到左上角
    printf "\033[H"
    
    while true; do
        echo
        echo -e "[1] "
        echo -e "[2] "
        echo -e "[Q] 退出系统"
        echo
        read -rep "${YELLOW}请输入序号${RESET}  ${YELLOW_AC}▶${RESET}" choice
        case "${choice}" in
            1)
                func_method_1
                ;;
            2)
                func_method_2
                ;;
            [Qq])
                LINFO "退出系统"
                exit 0
                ;;
            *)
                LWARN "输入有误"
                ;;
        esac
    done

}


# 别忘了调用方法
func_main

 

posted @ 2026-08-05 10:55  HOUHUILIN  阅读(6)  评论(0)    收藏  举报