侧边栏壁纸
  • 累计撰写 99 篇文章
  • 累计创建 41 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

shell-template

天明
2026-07-07 / 0 评论 / 0 点赞 / 1 阅读 / 0 字 / 正在检测是否收录...
#!/bin/bash
#======================================================
# 脚本名称: 脚本模板
# 描述: 包含基本路径、日期时间、日志打印、参数解析
#======================================================

set -euo pipefail

# ==================== 基本路径 ====================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SCRIPT_NAME="$(basename "${BASH_SOURCE[0]}")"
BASE_DIR="${SCRIPT_DIR}"
LOG_DIR="${BASE_DIR}/logs"
mkdir -p "${LOG_DIR}"

# ==================== 日期时间 ====================
readonly DATE_FMT="%Y-%m-%d"
readonly DATETIME_FMT="%Y-%m-%d %H:%M:%S"
readonly TODAY="$(date +${DATE_FMT})"
readonly NOW="$(date +${DATETIME_FMT})"
readonly TIMESTAMP="$(date +%Y%m%d_%H%M%S)"

# ==================== 日志打印 ====================
LOG_FILE="${LOG_DIR}/${SCRIPT_NAME%.sh}_${TODAY}.log"

log() {
    local level="$1"
    shift
    local msg="$*"
    local ts
    ts="$(date +${DATETIME_FMT})"
    local line="[${ts}] [${level}] ${msg}"
    echo "${line}" | tee -a "${LOG_FILE}"
}

log_info()  { log "INFO"  "$@"; }
log_warn()  { log "WARN"  "$@"; }
log_error() { log "ERROR" "$@"; }
log_debug() { log "DEBUG" "$@"; }

# ==================== 使用说明 ====================
usage() {
    cat <<EOF
用法: ${SCRIPT_NAME} [选项]

选项:
    -h, --help          显示帮助信息
    -v, --verbose       开启详细模式
    -o, --output DIR    指定输出目录 (默认: ${BASE_DIR}/output)
    -f, --file FILE     指定输入文件
    -n, --name NAME     指定名称
    --dry-run           模拟执行,不实际操作

示例:
    ${SCRIPT_NAME} -f input.txt -n test --verbose
EOF
    exit 0
}

# ==================== 参数解析 ====================
# 默认值
VERBOSE=false
DRY_RUN=false
OUTPUT_DIR="${BASE_DIR}/output"
INPUT_FILE=""
TARGET_NAME=""

parse_args() {
    while [[ $# -gt 0 ]]; do
        case "$1" in
            -h|--help)
                usage
                ;;
            -v|--verbose)
                VERBOSE=true
                shift
                ;;
            -o|--output)
                OUTPUT_DIR="$2"
                shift 2
                ;;
            -f|--file)
                INPUT_FILE="$2"
                shift 2
                ;;
            -n|--name)
                TARGET_NAME="$2"
                shift 2
                ;;
            --dry-run)
                DRY_RUN=true
                shift
                ;;
            *)
                log_error "未知参数: $1"
                usage
                ;;
        esac
    done
}

# ==================== 参数校验 ====================
validate() {
    if [[ -n "${INPUT_FILE}" && ! -f "${INPUT_FILE}" ]]; then
        log_error "输入文件不存在: ${INPUT_FILE}"
        exit 1
    fi
    mkdir -p "${OUTPUT_DIR}"
}

# ==================== 主逻辑 ====================
main() {
    parse_args "$@"

    log_info "========== 脚本开始执行 =========="
    log_info "脚本目录: ${SCRIPT_DIR}"
    log_info "当前时间: ${NOW}"
    log_info "输出目录: ${OUTPUT_DIR}"
    [[ -n "${INPUT_FILE}" ]]  && log_info "输入文件: ${INPUT_FILE}"
    [[ -n "${TARGET_NAME}" ]] && log_info "目标名称: ${TARGET_NAME}"
    ${VERBOSE}  && log_debug "详细模式已开启"
    ${DRY_RUN}  && log_warn "模拟执行模式"

    validate

    # TODO: 在此处添加业务逻辑

    log_info "========== 脚本执行完成 =========="
}

main "$@"

0

评论区