envsubst 可直接替换模板中 $var 或 ${var} 占位符,要求变量已用 export 导出;支持全量替换或指定变量白名单,未设置变量默认替为空字符串。

直接用 envsubst 就能完成,核心是让模板里写对占位符、环境里设好对应变量、再用重定向把替换结果存到目标文件。
模板中怎么写占位符
支持两种写法,都有效:
-
$VAR —— 简洁,适合单个字母或短名(如
$PORT) -
${VAR} —— 推荐,尤其当变量名后紧跟其他字符时(如
${DOMAIN}_staging不会误判)
注意:不支持 $(VAR) 或 @VAR@ 这类语法,只认 $ 开头的变量引用。
环境变量必须提前导出
envsubst 只读取当前 shell 的 已导出 环境变量(即用 export VAR=value 设置的),普通 shell 变量(VAR=value)不会被识别。
例如:
- ✅ 正确:
export API_URL="https://api.example.com" - ❌ 无效:
API_URL="https://api.example.com"(没 export)
可在命令前一次性导出多个:export DOMAIN=prod.example.com PORT=8080 DEBUG=true
执行替换的常用方式
最常用的是输入输出重定向组合:
-
替换全部存在的环境变量:
envsubst config.conf -
只替换指定几个变量(白名单):
envsubst '$DOMAIN $PORT' config.conf(注意引号和空格) - 变量不存在时留空?默认就是——它不会报错,只是替换成空字符串
如果想避免空替换导致配置异常,建议先检查关键变量是否已设置:[[ -z "$DOMAIN" ]] && echo "DOMAIN missing!" && exit 1
实际小例子
模板 nginx.template:
server {
listen ${PORT};
server_name ${DOMAIN};
location / {
proxy_pass http://${BACKEND}:${BACKEND_PORT};
}
}
执行:
export PORT=80 DOMAIN=app.local BACKEND=localhost BACKEND_PORT=3000envsubst nginx.conf
生成的 nginx.conf 中所有 ${...} 都会被真实值替换,可直接交给 Nginx 加载。











