如何使用 jq 数组值获得 return true
How to get return true with jq array value
我正在尝试使用以下 jq 命令 return 如果列表中的任何一个条件为真,则输出为真。
.Tags[] as $t| "aws:cloudformation:stack-name"| IN($t[])
输入
{
"Tags": [{
"Value": "INF-D-XX-SEC-OPNV-UW1",
"Key": "Name"
},
{
"Value": "INF-D-XX-CFS-StandardInfrastructure-UW1",
"Key": "aws:cloudformation:stack-name"
},
{
"Value": "sgOpenVPNAccess",
"Key": "aws:cloudformation:logical-id"
},
{
"Value": "UW1",
"Key": "Location"
},
{
"Value": "INF",
"Key": "Application"
},
{
"Value": "D",
"Key": "Parent Environment"
},
{
"Value": "arn:aws:cloudformation:us-west-1:111111:stack/INF-D-XX-CFS-StandardInfrastructure-UW1/1111-11-11e8-96fe-11",
"Key": "aws:cloudformation:stack-id"
},
{
"Value": "OPNV",
"Key": "ResourceType"
}
]
}
这给了我一个 returned 布尔值列表,如下所示,
--输出--
true
false
false
false
false
false
false
如果
之一,我想 return 一个值 true
Key="aws:cloudformation:stack-name"
被检测到但没有给我返回值列表。
一个解决方案,即
从 .tags 构建一个布尔值数组,然后使用 any 聚合所有布尔值
jq '.Tags | map( .Key == "aws:cloudformation:stack-name" ) | any '
由于 any/2
:
,一个非常有效的解决方案(在时间和 space 方面)很容易
any(.Tags[]; .Key == "aws:cloudformation:stack-name")
这当然会计算为 true
或 false
。如果你想要 true
或什么都不想要,你可以在上面加上 // empty
。
基于@peak 之前的回答,由于不能 post 评论,您可以使用 jq 的 '-e' 标志来设置退出状态,这样您就可以轻松地链接 shell 命令一起。这避免了必须测试返回的字符串。
jq -e 'any(.Tags[]; .Key == "aws:cloudformation:stack-name")' json >/dev/null && echo 'Exists' || echo 'Missing'
我正在尝试使用以下 jq 命令 return 如果列表中的任何一个条件为真,则输出为真。
.Tags[] as $t| "aws:cloudformation:stack-name"| IN($t[])
输入
{
"Tags": [{
"Value": "INF-D-XX-SEC-OPNV-UW1",
"Key": "Name"
},
{
"Value": "INF-D-XX-CFS-StandardInfrastructure-UW1",
"Key": "aws:cloudformation:stack-name"
},
{
"Value": "sgOpenVPNAccess",
"Key": "aws:cloudformation:logical-id"
},
{
"Value": "UW1",
"Key": "Location"
},
{
"Value": "INF",
"Key": "Application"
},
{
"Value": "D",
"Key": "Parent Environment"
},
{
"Value": "arn:aws:cloudformation:us-west-1:111111:stack/INF-D-XX-CFS-StandardInfrastructure-UW1/1111-11-11e8-96fe-11",
"Key": "aws:cloudformation:stack-id"
},
{
"Value": "OPNV",
"Key": "ResourceType"
}
]
}
这给了我一个 returned 布尔值列表,如下所示,
--输出--
true
false
false
false
false
false
false
如果
之一,我想 return 一个值true
Key="aws:cloudformation:stack-name"
被检测到但没有给我返回值列表。
一个解决方案,即 从 .tags 构建一个布尔值数组,然后使用 any 聚合所有布尔值
jq '.Tags | map( .Key == "aws:cloudformation:stack-name" ) | any '
由于 any/2
:
any(.Tags[]; .Key == "aws:cloudformation:stack-name")
这当然会计算为 true
或 false
。如果你想要 true
或什么都不想要,你可以在上面加上 // empty
。
基于@peak 之前的回答,由于不能 post 评论,您可以使用 jq 的 '-e' 标志来设置退出状态,这样您就可以轻松地链接 shell 命令一起。这避免了必须测试返回的字符串。
jq -e 'any(.Tags[]; .Key == "aws:cloudformation:stack-name")' json >/dev/null && echo 'Exists' || echo 'Missing'