我有一个名为 的文件template.tpl
。
#!/bin/bash
RESULT=`curl https://${MY_VAR_USERNAME}:${MY_VAR_PASSWORD}@my-domain.com/service`
echo $RESULT
if [ "$RESULT" == "ok" ]; then
exit 0
fi
exit 2
该模板文件应使用此脚本进行解析replace-script.sh
#!/bin/bash
set -a
: ${MY_VAR_USERNAME="testuser"}
: ${MY_VAR_PASSWORD="supersecurepassword"}
# replace every variable declared in a .tpl file delete the .tpl extention
srcFile="template.tpl"
cat $srcFile | envsubst > $(echo $srcFile | sed -r 's/.tpl$//')
当我现在做时,bash replace-script.sh
我得到了以下结果:
#!/bin/bash
RESULT=`curl https://testuser:[email protected]/service`
echo
if [ "" == "ok" ]; then
exit 0
fi
exit 2
因此,我想要解析的变量被完美解析了。但糟糕的是,每个 $VAR 都被替换了,而不仅仅是我的replace-script.sh
文件中声明的变量。
答案1
envsubst
可以采用要替换的参数列表:
envsubst '$MY_VAR_USERNAME $MY_VAR_PASSWORD'
(它们必须在一个字符串中,并且必须有符号$
,很烦人。)
请注意,标准字符串比较运算符是=
,而不是==
,后者在 Bash 和其他语言中有效,但在dash
Debian 和 Ubuntu/bin/sh
中无效
另外,您可以跳过 sed 并使用 shell 的扩展从文件名中删除后缀:"${srcFile%.tpl}"