本文目录导读:

我来为您提供一个完整的环境变量切换脚本方案,包含多种常用场景。
基础版 - 多环境配置切换
#!/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
# 在此实现环境选择逻辑
}
这个脚本系统提供了完整的解决方案,包括:
- 基本的切换功能
- 备份和回滚机制
- 日志记录
- 环境比较
- 图形化界面支持
您可以根据实际需求调整和扩展这些功能。