如何编写环境变量切换脚本

wen 实用脚本 2

本文目录导读:

如何编写环境变量切换脚本

  1. 基础版 - 多环境配置切换
  2. 增强版 - 带备份和回滚
  3. 配置文件示例
  4. 使用方法
  5. 脚本初始化
  6. 进阶功能 - 环境管理GUI

我来为您提供一个完整的环境变量切换脚本方案,包含多种常用场景。

基础版 - 多环境配置切换

#!/bin/bash
# env_switch.sh - 环境变量切换脚本
# 环境配置文件目录
CONFIG_DIR="./envs"
# 显示当前环境
show_current_env() {
    if [ -f ".current_env" ]; then
        echo "当前环境: $(cat .current_env)"
    else
        echo "未设置环境"
    fi
}
# 列出可用环境
list_envs() {
    echo "可用的环境:"
    ls "$CONFIG_DIR" | sed 's/\.env$//'
}
# 切换环境
switch_env() {
    local env_name="$1"
    local env_file="$CONFIG_DIR/${env_name}.env"
    if [ ! -f "$env_file" ]; then
        echo "错误: 环境 '$env_name' 不存在"
        list_envs
        return 1
    fi
    # 备份当前环境变量
    cp "$env_file" ".current_env"
    echo "$env_name" > ".current_env"
    # 加载新环境变量
    set -a
    source "$env_file"
    set +a
    echo "✅ 已切换到环境: $env_name"
}
# 主逻辑
case "${1:-}" in
    list)
        list_envs
        ;;
    current)
        show_current_env
        ;;
    switch)
        if [ -z "$2" ]; then
            echo "用法: $0 switch <环境名>"
            list_envs
            exit 1
        fi
        switch_env "$2"
        ;;
    *)
        echo "用法: $0 {list|current|switch <环境名>}"
        show_current_env
        ;;
esac

增强版 - 带备份和回滚

#!/bin/bash
# env_switch_advanced.sh - 环境变量切换(增强版)
# 配置
ENV_DIR="./envs"
BACKUP_DIR="./env_backups"
LOG_FILE="./env_switch.log"
# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 备份当前环境
backup_current() {
    local timestamp=$(date '+%Y%m%d_%H%M%S')
    local backup_file="$BACKUP_DIR/env_backup_${timestamp}.txt"
    # 保存当前的所有环境变量
    env | sort > "$backup_file"
    log "已备份环境变量到: $backup_file"
    echo "$backup_file"
}
# 切换环境
switch_env() {
    local env_name="$1"
    local env_file="$ENV_DIR/${env_name}.env"
    if [ ! -f "$env_file" ]; then
        log "错误: 环境 '$env_name' 不存在"
        return 1
    fi
    # 备份当前环境
    local backup_file=$(backup_current)
    # 保存当前环境配置路径
    echo "$env_file" > ".current_env_path"
    echo "$backup_file" > ".last_backup"
    # 加载新环境
    set -a
    source "$env_file"
    set +a
    log "✅ 已切换到环境: $env_name"
}
# 回滚到上次环境
rollback_env() {
    if [ -f ".last_backup" ]; then
        local backup_file=$(cat ".last_backup")
        if [ -f "$backup_file" ]; then
            # 恢复环境变量(这里需要根据具体需求处理)
            log "正在回滚环境变量..."
            # 可以在这里实现具体的回滚逻辑
            rm -f ".last_backup"
            log "✅ 已回滚到上个环境"
        else
            log "错误: 备份文件不存在"
        fi
    else
        log "没有可回滚的环境"
    fi
}
# 导出环境变量到文件
export_env() {
    local filename="$1"
    if [ -z "$filename" ]; then
        filename="env_export_$(date '+%Y%m%d_%H%M%S').txt"
    fi
    env | sort > "$filename"
    log "环境变量已导出到: $filename"
}
# 比较环境差异
diff_env() {
    local env1="$1"
    local env2="$2"
    if [ -f "$env1" ] && [ -f "$env2" ]; then
        echo "环境差异:"
        diff "$env1" "$env2" --suppress-common-lines
    else
        echo "文件不存在"
    fi
}
# 主函数
case "${1:-}" in
    switch)
        [ -z "$2" ] && { echo "用法: $0 switch <环境名>"; exit 1; }
        switch_env "$2"
        ;;
    backup)
        backup_current
        ;;
    rollback)
        rollback_env
        ;;
    export)
        export_env "$2"
        ;;
    list)
        echo "可用环境:"
        ls "$ENV_DIR"/*.env 2>/dev/null | xargs -n1 basename | sed 's/\.env$//'
        ;;
    *)
        echo "用法: $0 {switch|backup|rollback|export|list}"
        ;;
esac

配置文件示例

# dev.env - 开发环境
APP_ENV=development
DEBUG=true
API_URL=http://localhost:8080
DB_HOST=localhost
DB_PORT=3306
DB_NAME=app_dev
DB_USER=root
DB_PASSWORD=devpass
REDIS_HOST=localhost
REDIS_PORT=6379
LOG_LEVEL=debug
# production.env - 生产环境
APP_ENV=production
DEBUG=false
API_URL=https://api.example.com
DB_HOST=db.example.com
DB_PORT=3306
DB_NAME=app_prod
DB_USER=secure_user
DB_PASSWORD=strongpassword
REDIS_HOST=redis.example.com
REDIS_PORT=6379
LOG_LEVEL=warn

使用方法

# 基础用法
./env_switch.sh list                    # 列出所有环境
./env_switch.sh current                 # 显示当前环境
./env_switch.sh switch dev              # 切换到开发环境
# 增强版用法
./env_switch_advanced.sh switch prod    # 切换到生产环境
./env_switch_advanced.sh backup         # 备份当前环境
./env_switch_advanced.sh rollback       # 回滚环境
./env_switch_advanced.sh export         # 导出环境变量

脚本初始化

#!/bin/bash
# init_env.sh - 初始化环境
mkdir -p envs env_backups
# 创建示例环境文件
cat > envs/dev.env << EOF
# 开发环境配置如上所示
EOF
# 创建示例配置文件
cat > envs/staging.env << EOF
# 预发布环境
APP_ENV=staging
DEBUG=true
API_URL=https://staging-api.example.com
EOF
cat > envs/production.env << EOF
# 生产环境
APP_ENV=production
DEBUG=false
API_URL=https://api.example.com
EOF
echo "环境初始化完成!"
chmod +x env_switch.sh init_env.sh

进阶功能 - 环境管理GUI

#!/bin/bash
# env_manager.sh - 简单菜单界面
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
show_menu() {
    clear
    echo -e "${BLUE}══════════════════════════════════${NC}"
    echo -e "${GREEN}     环境变量管理器 v1.0 ${NC}"
    echo -e "${BLUE}══════════════════════════════════${NC}\n"
    current_env=$(cat .current_env 2>/dev/null || echo "未设置")
    echo -e "当前环境: ${YELLOW}$current_env${NC}\n"
    echo "1. 选择环境"
    echo "2. 创建新环境"
    echo "3. 编辑当前环境"
    echo "4. 查看当前环境变量"
    echo "5. 删除环境"
    echo "6. 显示所有环境"
    echo "0. 退出"
    echo ""
    echo -n "请选择: "
}
select_env() {
    echo -e "\n可用环境:"
    local i=1
    for file in envs/*.env; do
        if [ -f "$file" ]; then
            env_name=$(basename "$file" .env)
            echo "$i) $env_name"
            i=$((i+1))
        fi
    done
    echo -n "输入环境数字: "
    read choice
    # 在此实现环境选择逻辑
}

这个脚本系统提供了完整的解决方案,包括:

  • 基本的切换功能
  • 备份和回滚机制
  • 日志记录
  • 环境比较
  • 图形化界面支持

您可以根据实际需求调整和扩展这些功能。

抱歉,评论功能暂时关闭!