如何在 jq 映射期间使用(读取)关联数组中的值?

How to use(read) value from associative array during jq map?

我正在使用 json 通过 jq 读取 aws ssm 参数,并希望在一些处理和别名映射后将它们放入 yaml 文件中。

我有一个将参数名称映射到某个内部名称的关联数组(参见 process.sh)

我的简化example.json是

{
  "Parameters": [
    {
      "Name": "/dev/applications/web/some_great_key",
      "Value": "magicvaluenotrelevant"
    },
    {
      "Name": "/dev/applications/web/api_magic",
      "Value": "blabla"
    }
  ]
}

我的 bash 脚本 process.sh

#!/usr/bin/env bash

declare -A ssmMap
ssmMap[/dev/applications/web/some_great_key]=theGreatKEYAlias
ssmMap[/dev/applications/web/api_magic]=apiKey

jq -r '
  .Parameters
  | map({
        Name: .Name,
        parameterValue: .Value
    })
  | map((${!ssmMap[.Name]} + ": \"" + .parameterValue + "\""))
  | join("\n")
' < example.json;

I want/expected 输出为:

ssm_theGreatKEYAlias: "magicvaluenotrelevant"
ssm_apiKey: "singleblabla"

使用我提供的 process.sh 脚本时出现错误,因为找不到在 jq 映射中使用关联数组 sshMap 的方法,将参数名称从 json 转换为来自 sshMap 的映射别名。

知道如何实现吗?

如果我把process.sh的第13行改成

  | map((.Name + ": \"" + .parameterValue + "\""))

它工作正常但没有映射,使用来自 json 文件的原始参数名称。

您正在尝试从 jq 访问 shell 变量。

固定:

ssm_map='
   {
      "some_great_key": "theGreatKEYAlias",
      "api_magic":      "apiKey"
   }
'

jq -r --argjson ssm_map "$ssm_map" '
   .Parameters[] |
   "ssm_\( $ssm_map[ .Name ] ): \"\( .Value )\""
'

Demo 在 jqplay

您可以将您描述的变量转换为 JSON,难度各不相同(取决于您愿意接受的限制,如果有的话)。但是,由于您是根据 yq 的输出构建变量,应该可以直接让它输出 JSON。

如果您的实际任务是从 YAML 转换为 JSON.

,则使用 mikefarah/yq or kislyuk/yq or itchyny/gojq 绝对是更好的方法

但是,要完成您在原始问题中描述的任务,可以使用 --args 选项添加 bash 关联数组的键和值,并在 [=13] 中访问它们=] 通过 $ARGS.positional 数组(需要 jq 版本 1.6),然后通过 transpose 对该数组的两半恢复关联,并使用来自的键创建一个 INDEX前半部分,然后可以与 JOIN 一起使用来创建所需的文本行,使用 -r 选项将其输出为原始文本。

jq -r '
  JOIN(
    $ARGS.positional | [.[:length/2], .[length/2:]] | transpose | INDEX(.[0]);
    .Parameters[];
    .Name;
    "ssm_\(.[1][1] // .[0].Name): \(.[0].Value)"
  )
' example.json --args "${!ssmMap[@]}" "${ssmMap[@]}"
ssm_theGreatKEYAlias: magicvaluenotrelevant
ssm_apiKey: blabla

回退 // .[0].Name 对于示例文件来说是不必要的,但添加后备是为了使用原始密钥,以防 bash 数组未涵盖输入密钥。