【发布时间】:2022-01-10 00:12:41
【问题描述】:
我有以下 JSON 结构:
{
"host1": "$PROJECT1",
"host2": "$PROJECT2",
"host3" : "xyz",
"host4" : "$PROJECT4"
}
以及shell中的以下环境变量:
PROJECT1="randomtext1"
PROJECT2="randomtext2"
PROJECT4="randomtext3"
我想检查每个键的值,如果它们有一个“$”字符,请将它们替换为它们各自的环境变量(它已经存在于 shell 中),以便我的 JSON 模板以正确的方式呈现环境变量。
我可以使用 jq 的 --args 选项,但我想要渲染的实际 JSON 模板中有很多变量。
我一直在尝试以下方法:
jq 'with_entries(.values as v | env.$v)
基本上将每个值作为变量,然后使用 env 对象中的变量更新其值,但似乎我错过了一些理解。有没有一种简单的方法可以做到这一点?
编辑
感谢对这个问题的回答,我能够实现我更大的目标,其中一部分被问到这个问题
- 遍历对象中的每个值,
- 检查其值,
- 如果它是一个字符串并且以字符“$”开头
- 使用该值将其更新为同名的环境变量。
- 如果它是一个数组
- 使用该值检索同名的环境变量
- 用“,”作为分隔符分割字符串,返回一个字符串数组
- 用字符串数组更新值
- 如果它是一个字符串并且以字符“$”开头
jq 'with_entries(.value |= (if (type=="array") then (env[.[0][1:]] | split(",")) elif (type=="string" and startswith("$")) then (env[.[1:]]) else . end))'
【问题讨论】:
-
由于 $PROJECT4,所示模板作为 JSON 不太有效。请澄清并更正描述或模板。
-
我的错,已更正。
标签: json shell environment-variables jq