如何通过Shell脚本基于给定模板生成properties配置文件
这里有两种实用的Shell脚本方案来实现你的需求,都能生成带分区(dev、qa等)的config.properties配置文件,完全匹配你给出的示例格式:
方案一:直接在脚本中定义配置生成
这种方式不需要额外模板文件,所有配置都在脚本里维护,适合结构简单、变动不频繁的场景:
#!/bin/bash # 指定输出的配置文件路径 OUTPUT_FILE="config.properties" # 先清空文件(如果已存在),避免残留旧内容 > "$OUTPUT_FILE" # 用关联数组存储每个环境的配置键值对,清晰直观 declare -A dev_config=( ["JDBC_URL"]="jdbc:h2:mem:mem_test;MODE=Oracle" ["JDBC_USERNAME"]="" ["JDBC_PASSWORD"]="" ["SERVICE_ENDPOINT"]="http://localhost:8080/Central/api/AppService" ) declare -A qa_config=( ["JDBC_URL"]="jdbc:oracle:thin:@qa-oracle:1521:qa" ["JDBC_USERNAME"]="qauser" ["JDBC_PASSWORD"]="qapass" ["SERVICE_ENDPOINT"]="http://qa.example.com/Central/api/AppService" ) # 封装一个复用函数,负责把单个环境的配置格式写入文件 write_env_config() { local env_name=$1 declare -n config=$2 # 引用传入的关联数组 # 写入环境分区头 echo "[$env_name]" >> "$OUTPUT_FILE" # 遍历配置键值对写入 for key in "${!config[@]}"; do echo "$key = ${config[$key]}" >> "$OUTPUT_FILE" done echo "" >> "$OUTPUT_FILE" # 环境之间加空行,提升可读性 } # 生成各个环境的配置 write_env_config "dev" dev_config write_env_config "qa" qa_config echo "✅ 配置文件 $OUTPUT_FILE 已生成完成!"
使用说明:
- 将脚本保存为
generate_config.sh - 赋予执行权限:
chmod +x generate_config.sh - 运行脚本:
./generate_config.sh,就能得到目标配置文件
如果要添加新环境(比如prod),只需要新增一个关联数组存储prod的配置,再调用一次write_env_config函数即可。
方案二:基于模板文件生成
这种方式把配置结构和实际值分离,模板文件负责定义格式,脚本负责替换变量,适合需要频繁调整配置结构的场景:
第一步:创建模板文件config.template
先写好配置的结构,用{{变量名}}作为占位符:
[dev] JDBC_URL = {{DEV_JDBC_URL}} JDBC_USERNAME = {{DEV_JDBC_USERNAME}} JDBC_PASSWORD = {{DEV_JDBC_PASSWORD}} SERVICE_ENDPOINT = {{DEV_SERVICE_ENDPOINT}} [qa] JDBC_URL = {{QA_JDBC_URL}} JDBC_USERNAME = {{QA_JDBC_USERNAME}} JDBC_PASSWORD = {{QA_JDBC_PASSWORD}} SERVICE_ENDPOINT = {{QA_SERVICE_ENDPOINT}}
第二步:编写替换脚本generate_config.sh
#!/bin/bash # 定义模板文件和输出文件路径 TEMPLATE_FILE="config.template" OUTPUT_FILE="config.properties" # 先检查模板文件是否存在 if [ ! -f "$TEMPLATE_FILE" ]; then echo "❌ 错误:模板文件 $TEMPLATE_FILE 不存在,请先创建!" exit 1 fi # 定义每个占位符对应的实际值 DEV_JDBC_URL="jdbc:h2:mem:mem_test;MODE=Oracle" DEV_JDBC_USERNAME="" DEV_JDBC_PASSWORD="" DEV_SERVICE_ENDPOINT="http://localhost:8080/Central/api/AppService" QA_JDBC_URL="jdbc:oracle:thin:@qa-oracle:1521:qa" QA_JDBC_USERNAME="qauser" QA_JDBC_PASSWORD="qapass" QA_SERVICE_ENDPOINT="http://qa.example.com/Central/api/AppService" # 使用系统自带的envsubst工具替换模板中的变量 envsubst < "$TEMPLATE_FILE" > "$OUTPUT_FILE" echo "✅ 配置文件 $OUTPUT_FILE 已从模板生成完成!"
使用说明:
- 确保
envsubst工具已安装(大部分Linux发行版默认自带,Debian/Ubuntu可以用apt install gettext安装) - 赋予脚本执行权限后运行,就能生成目标配置文件
额外提示:
- 如果你的密码包含特殊字符(比如
$、!),记得用单引号包裹变量值,避免Shell解析出错 - 方案一中的关联数组需要Bash 4.0及以上版本支持,如果是旧版本Bash,可以改用
key=value的普通变量组合来实现 - 两种方案都可以根据需求扩展,比如从外部文件读取配置、批量生成多个环境等
内容的提问来源于stack exchange,提问作者Srishti
相关产品推荐
相关产品推荐

