使用 jq 将许多值替换为变量值



使用jq,是否可以将示例 JSON 中每个参数的值替换为作为初始值的变量的值?

在我的方案中,Azure DevOps 不会对 JSON 文件进行任何类型的变量替换,因此我需要手动执行此操作。例如,假设$SUBSCRIPTION_ID设置为abc-123,我想使用jq来更新 JSON 文件。

我可以使用.parameters[].value提取值,但我似乎找不到设置每个单独值的方法。

这里的主要挑战是解决方案应该是可重用的,并且不同的 JSON 文件将具有不同的parameters,所以我认为我不能使用--argjson.

原始 JSON

{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/parametersTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"subscriptionId": {
"value": "$SUBSCRIPTION_ID"
},
"topicName": {
"value": "$TOPIC_NAME"
}
}
}

变量

SUBSCRIPTION_ID="abc-123"
TOPIC_NAME="SomeTopic"

所需的 JSON

{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/parametersTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"subscriptionId": {
"value": "abc-123"
},
"topicName": {
"value": "SomeTopic"
}
}
}

导出这些变量,以便您可以从 jq 中访问它们。

export SUBSCRIPTION_ID TOPIC_NAME
jq '.parameters[].value |= (env[.[1:]] // .)' file

//.部分用于保持环境中不存在变量,如果没有必要,您可以删除它

使用--argjson; 本质上,您将忽略参数化JSON的尝试,而只是无条件地替换值。

jq --argjson x "$SUBSCRIPTION_ID" 
--argjson y "$TOPIC_NAME" 
'.parameters.subscriptionId.value = $x; .parameters.topicName.value = $y' 
config.json

下面是基于架构内容和可用环境变量的"数据驱动"方法:

export SUBSCRIPTION_ID="abc-123"
export TOPIC_NAME="SomeTopic"
< schema.json jq '.parameters 
|= map_values(if .value | (startswith("$") and env[.[1:]]) 
then .value |= env[.[1:]] else . end)'

请注意,jq 程序中没有出现任何模板名称。

如果你的 shell 支持它,你可以通过在 jq 命令前面加上变量赋值来避免"export"命令,如下所示:

SUBSCRIPTION_ID="abc-123" TOPIC_NAME="SomeTopic" jq -f program.jq schema.json

警告

使用环境变量传入参数值可能不是一个好主意。 两种替代方法是在文本文件中或作为 JSON 对象提供名称-值对。 另请参阅使用 jq 作为模板引擎

最新更新