【问题标题】:How to read key=value variables from one file and replace ${key} in another file?如何从一个文件中读取 key=value 变量并在另一个文件中替换 ${key}?
【发布时间】:2021-02-11 15:39:35
【问题描述】:

类似于例如这个:Parse out key=value pairs into variables

.env

key1=value1
key2=value2

config.yml

some:
  key1: ${key1}
  key2: ${key2}

如何将config.yml 中的值替换为.env 中的值?

到目前为止,我得到了这个:

awk 'FNR==NR {n=index($1,"=");if(n){vars[substr($i, 1, n - 1)]=substr($i, n + 1)}; next } { for (i in vars) gsub("${"i"}", vars[i]) }1' .env file.yml
                                                                                                                  ^- Can't figure out how to replace $

我可以使它与{key1} 一起工作,但不能与${key1} 一起工作。我怎样才能做到这一点?

【问题讨论】:

标签: bash shell unix


【解决方案1】:

最简单的是:

. .env
export key1 key2
envsubst '$key1 $key2' < config.yml

不知道如何替换 $

看来你必须逃避${},比如:

gsub("\\$\\{"i"\\}", vars[i])

【讨论】:

  • 另一种选择:. &lt;(sed 's/^/export /' .env); envsubst &lt;config.yml
  • .env 文件不一定是有效的 shell 脚本。
  • 谢谢,我为正确的转义而苦苦挣扎。 envsubst 将是完美的,但如果值包含 = 则不起作用
  • envsubst would be perfect but doesn't work if the value contains = 为我工作:repl.it/@kamilcukrowski/ProudOverdueSet#main.sh
【解决方案2】:

不使用awk

(set -a; source .env; envsubst < config.yml)

some:
  key1: value1
  key2: value2
  • (...):在子shell中运行命令行以避免污染当前shell的环境
  • set -a:导出所有声明变量
  • source .env:来源在.env文件中
  • envsubst &lt; config.yml:替换 config.yml 中的环境变量

【讨论】:

  • .env 文件不一定是有效的 shell 脚本; source 不是将这些变量转换为 shell 变量的可靠方法。
  • 好的,我刚刚在 OP 的问题中看到了一个示例,它看起来确实像 shell 变量。
  • npmjs.com/package/dotenv 发散的标准示例:JSON={"foo": "bar"}.env 文件不需要引用 RHS。 foo="x\ny" 也是多行字符串,而不是单个 4 字符的字符串。
猜你喜欢
  • 1970-01-01
  • 2020-11-19
  • 2012-07-22
  • 2012-12-08
  • 1970-01-01
  • 2011-11-28
  • 2015-12-22
  • 2017-05-07
  • 2019-11-12
相关资源
最近更新 更多