部署脚本中环境变量设置的实用技巧

在日常开发和运维过程中,部署脚本是自动化任务的核心工具。无论是上线新版本、重启服务,还是同步数据,脚本都能帮我们省下大量重复操作的时间。但很多人在写部署脚本时,容易忽略环境变量的合理设置,结果导致脚本在不同机器上表现不一致,甚至直接失败。

为什么环境变量这么重要

设想你有两套环境:测试环境用的是本地数据库,生产环境连的是远程高可用集群。如果脚本里直接写死数据库地址,每次切换环境都得改代码,不仅麻烦还容易出错。通过环境变量,可以在不同机器上动态指定配置,脚本本身保持不变。

常见的设置方式

最简单的做法是在执行脚本前临时赋值:

DB_HOST=192.168.1.100 PORT=3000 ./deploy.sh

这种方式适合一次性任务。但如果需要持久化配置,比如 CI/CD 流水线中反复使用,推荐写入环境文件。创建一个 .env 文件:

DB_HOST=prod-db.example.com
PORT=8080
NODE_ENV=production

然后在脚本开头读取:

if [ -f .env ]; then
  export $(cat .env | grep -v '^#' | xargs)
fi

避免敏感信息硬编码

有些人图省事,把密码直接写进脚本:

mysql -uroot -p'secret123' << EOF
...

这种做法极不安全,一旦代码泄露,后果严重。正确的做法是通过环境变量传入:

mysql -uroot -p$DB_PASSWORD << EOF
...

配合 CI 平台的加密变量功能,真正实现配置与代码分离。

跨平台兼容性小细节

Mac 和 Linux 对 source 命令支持较好,但 Windows 的 Git Bash 或 WSL 可能需要额外处理。可以加一层判断:

if [ -f .env ]; then
  while IFS='=' read -r key value; do
    export "$key=$value"
  done < .env
fi

这样不管在哪种环境下运行,都能稳定加载变量。

调试时的小技巧

当脚本行为异常,怀疑是环境变量没生效时,可以临时加一行打印:

echo "当前配置:DB_HOST=$DB_HOST, PORT=$PORT"

或者只查看已设置的变量:

env | grep DB_

快速定位问题来源。别忘了检查拼写,DBHOSTDB_HOST 是两个完全不同的变量。