我有一个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中的变量设置默认值,如下例所示,不幸的是,在下面的示例中可以看到,并且#39; t work:
$ 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
文件的问题在哪里?
答案 0 :(得分:9)
根据man envsubst
,envsubst
只会以${VAR}
或$VAR
的形式替换对环境变量的引用。不支持${VAR:-default}
等特殊shell功能。您唯一能做的就是(重新)定义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
作为标准输入,并将其标准输出重定向到eval echo "$(cat input.json)" > output.json
(两者都由shell完成)。命令执行后,shell删除返回其原始环境的命令环境,即局部变量赋值不再有效。
无法从JSON文件中定义默认值,除非您自己实现程序,或者使用其他可以执行此操作的工具。
您可以执行以下操作,但 NOT WOMMENDED :
input.json
将eval
读入字符串,而不是echo <string>
使用命令${VAR:-default}
,就好像它是字面上的类型一样,这意味着任何嵌入的echo
内容都应该是在将字符串传递给{{1}}之前由shell扩展。 但任何其他嵌入式shell功能也将被评估,这会带来巨大的安全风险。
答案 1 :(得分:2)
我使用的是https://github.com/a8m/envsubst,它对原始gettext envsubst进行了增强,即模板文件中的表达式支持默认值。
自述文件中的示例正常工作。
echo 'welcome $HOME ${USER:=a8m}' | envsubst
答案 2 :(得分:0)
Blockquote 我正在使用https://github.com/a8m/envsubst,它对原始gettext envsubst进行了增强,该模板模板中的表达式支持默认值。
类似地,提供了一个名为'envsub'的Rust变体,它也支持默认值。参见https://github.com/stephenc/envsub。