常见的部署脚本传参方式
在日常开发中,写完代码只是第一步,真正让程序跑起来还得靠部署。而部署脚本作为自动化流程的核心,如何灵活接收外部参数就成了关键。很多人一开始都是把配置写死在脚本里,改个端口或路径就得重新编辑文件,既麻烦又容易出错。
其实,只要掌握几种常用的传参方法,就能让脚本变得通用又灵活。
命令行直接传参(Positional Arguments)
最简单的方式就是通过命令行位置参数传递。比如你有个部署脚本 deploy.sh,想动态指定环境和版本号:
./deploy.sh production v1.2.0在脚本内部可以通过 $1、$2 获取:
#!/bin/bash
ENV=$1
VERSION=$2
echo "部署到 $ENV 环境,版本:$VERSION"这种方式适合参数少、顺序固定的情况,但一旦参数多了就容易混淆。
使用选项式传参(Flags with getopts)
更规范的做法是用 -e production 这样的选项格式。Shell 提供了 getopts 来解析参数:
#!/bin/bash
ENV="dev"
PORT=8080
while getopts e:p: flag
do
case "${flag}" in
e) ENV=${OPTARG} ;;
p) PORT=${OPTARG} ;;
esac
done
echo "环境:$ENV,端口:$PORT"调用时可以这样:
./deploy.sh -e staging -p 9000参数顺序不再重要,可读性也更强,适合中等复杂度的脚本。
环境变量传参
另一种常见方式是通过环境变量传参,特别适合 CI/CD 流水线场景。比如 Jenkins 或 GitHub Actions 中设置:
DEPLOY_ENV=production VERSION=v2.0.0 ./deploy.sh脚本中直接使用 $DEPLOY_ENV 和 $VERSION 即可。这种方式无需修改脚本逻辑,换环境只需改变量,非常干净。
配置文件注入
当参数越来越多,比如数据库地址、密钥、超时时间等,写在命令行就不现实了。这时候可以把配置抽成一个文件,比如 config.env:
ENV=production
DB_HOST=db.prod.example.com
API_TIMEOUT=30然后在脚本开头加载:
if [ -f config.env ]; then
source config.env
fi结合命令行参数优先级控制,可以实现“配置文件兜底,命令行覆盖”的策略。
混合使用更灵活
实际项目中往往不是非此即彼。比如先加载默认配置,再读环境变量,最后用命令行参数覆盖:
#!/bin/bash
# 默认值
ENV=${DEPLOY_ENV:-dev}
PORT=${PORT:-8080}
# 命令行可覆盖
while getopts e:p: flag
do
case "${flag}" in
e) ENV=${OPTARG} ;;
p) PORT=${OPTARG} ;;
esac
done
echo "最终部署配置:环境=$ENV,端口=$PORT"这种层层覆盖的模式,在真实部署中非常实用。开发本地跑用默认值,测试环境走 CI 变量,上线前还能手动指定参数验证。
传参看似小事,但设计得好坏直接影响脚本的复用性和稳定性。别再把所有配置都写死在脚本里了,动动手指加几个参数,下次改配置时你会感谢自己。