我有一个类似于以下内容的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 envsubstenvsubst只会替换${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_VAROTHER_VAR分配了扩展表达式${VAR:-default}的值,该表达式实际上会扩展为default,除非定义了VAR并具有非空值。执行命令envsubst,接收文件input.json作为标准输入,并将其标准输出重定向到output.json(均由 shell 完成)。执行完命令后,shell会删除返回其原始环境的命令环境,即局部变量分配不再有效。

除非您自己实现一个程序或使用其他工具来定义默认值,否则无法从JSON文件中定义默认值。

您可以执行以下操作,但是它是不推荐使用:
eval echo "$(cat input.json)" > output.json

它将input.json读入字符串中,然后evalecho <string>当作字面意义上的命令来使用,这意味着在将字符串传递给${VAR:-default}之前, shell 程序应先扩展任何嵌入式echo的内容。 但是也会评估任何其他嵌入式shell功能,这会带来巨大的安全风险

关于linux - envsubst : default values for unset variables,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50230361/

10-11 15:46