如何在 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 数组未涵盖输入密钥。
我正在使用 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 数组未涵盖输入密钥。