我有一个类似于以下内容的json文件input.json
:
{
"variable" : "${ENV_VAR}"
}
当然,我可以像下面这样从bash调用envsubst:
$ export ENV_VAR=myvalue
$ envsubst < input.json > output.json
$ cat output.json
{
"variable" : "myvalue"
}
现在,我希望在未设置
ENV_VAR
的情况下,可以在input.json中设置变量的默认值,就像下面的示例一样,不幸的是,在下面的示例中,该示例不起作用:$ cat input.json
{
"variable" : "${ENV_VAR:=defaultvalue}"
}
$ export ENV_VAR=newvalue
$ envsubst < input.json > output.json
$ cat output.json
{
"variable" : "${ENV_VAR:=defaultvalue}"
}
$ unset ENV_VAR
$ envsubst < input.json > output.json
$ cat output.json
{
"variable" : "${ENV_VAR:=defaultvalue}"
}
很好奇的是,如果我像下面的示例一样执行envsubst(不涉及输入文件),则可以正常工作
$ export ENV_VAR=myvalue
$ echo "value is ${ENV_VAR:=defaultvalue}" | envsubst
value is myvalue
$ unset ENV_VAR
$ echo "value is ${ENV_VAR:=defaultvalue}" | envsubst
value is defaultvalue
文件哪里出问题了?
最佳答案
根据man envsubst
,envsubst
只会替换${VAR}
或$VAR
形式的对环境变量的引用。不支持特殊的shell功能,例如${VAR:-default}
。您唯一可以做的就是在envsubst
调用环境中(重新)定义所有变量,并在缺少它们的情况下分配本地默认值:
ENV_VAR="${ENV_VAR:-defaultvalue}" \
OTHER_VAR="${OTHER_VAR:-otherdefault}" \
envsubst < input.json > output.json
请注意,这实际上是一个命令行,分为多行,每行以一行续行
\
结尾。前两行是变量赋值,仅在最后一行中已执行命令envsubstr
的环境中有效。发生的事情是,shell将为执行命令创建一个环境(就像过去一样)。该环境最初是当前Shell环境的副本。在该新环境中,为ENV_VAR
和OTHER_VAR
分配了扩展表达式${VAR:-default}
的值,该表达式实际上会扩展为default
,除非定义了VAR
并具有非空值。执行命令envsubst
,接收文件input.json
作为标准输入,并将其标准输出重定向到output.json
(均由 shell 完成)。执行完命令后,shell会删除返回其原始环境的命令环境,即局部变量分配不再有效。除非您自己实现一个程序或使用其他工具来定义默认值,否则无法从JSON文件中定义默认值。
您可以执行以下操作,但是它是不推荐使用:
eval echo "$(cat input.json)" > output.json
它将
input.json
读入字符串中,然后eval
将echo <string>
当作字面意义上的命令来使用,这意味着在将字符串传递给${VAR:-default}
之前, shell 程序应先扩展任何嵌入式echo
的内容。 但是也会评估任何其他嵌入式shell功能,这会带来巨大的安全风险。关于linux - envsubst : default values for unset variables,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50230361/