我有一个如下所示的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文件的问题出在哪里?
发布于 2018-05-09 20:15:03
根据man envsubst的说法,envsubst只会以${VAR}或$VAR的形式替换对环境变量的引用。不支持像${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的值不为空,否则它实际上会展开为default。执行命令envsubst,将文件input.json作为标准输入接收,并将其标准输出重定向到output.json (两者都是由shell完成的)。执行完命令后,shell会删除命令环境,返回到其原始环境,即局部变量分配不再有效。
没有办法从JSON文件内部定义默认值,除非您自己实现一个程序来这样做,或者使用其他可以这样做的工具。
您可以执行以下操作,但不推荐使用
eval echo "$(cat input.json)" > output.json它会将input.json读入一个字符串,然后evaluate命令echo <string>,就好像它是按字面意思输入的一样,这意味着在将字符串传递给echo之前,任何嵌入的${VAR:-default}内容都应该由shell展开。但任何其他嵌入式外壳功能也将被评估,这将构成巨大的安全风险。
发布于 2020-03-06 17:25:59
我使用的是https://github.com/a8m/envsubst,它对原始的gettext envsubst进行了增强,使模板文件中的表达式支持默认值。
自述文件中的示例可以正常工作。
echo 'welcome $HOME ${USER:=a8m}' | envsubst发布于 2020-10-25 20:25:04
我正在使用https://github.com/a8m/envsubst,它对原始的
envsubst进行了增强,使模板文件中的表达式支持默认值。
类似地,也可以使用名为'envsub‘的Rust变体,它也支持默认值。参见https://github.com/stephenc/envsub。
https://stackoverflow.com/questions/50230361
复制相似问题