这有点棘手,但可以使用reduce 完成。整个事情可能是这样的:
selected_subnets_json=$(echo "\"$selected_subnets\"" | jq -c -M 'split(" ")')
echo "$input" | jq -M '.elements = [.elements[] | select(.VPCZoneIdentifier as $id | '"$selected_subnets_json"' | reduce .[] as $v (false; . or $id == $v))]'
第一部分从 shell 列表中创建一个 JSON 数组:
$ echo "\"$selected_subnets\"" | jq -c -M 'split(" ")'
["valueA","valueB"]
第二部分使用reduce 过滤器将.VPCZoneIdentifier 属性与该数组的所有元素进行比较。将selected_subnets_json 变量扩展到其中后,过滤器如下所示:
.elements = [
.elements[] |
select(.VPCZoneIdentifier as $id |
[ "valueA", "valueB" ] | reduce .[] as $v (false; . or $id == $v))
]
也就是说,elements 属性会被其中符合选择标准的元素覆盖
.VPCZoneIdentifier as $id | [ "valueA", "valueB" ] | reduce .[] as $v (false; . or $id == $v))
其中第一部分将VPCZoneIdentifier 记住为$id(因为. 很快将意味着完全不同的东西),并且
[ "valueA", "valueB" ] | reduce .[] as $v (false; . or $id == $v))
是子网数组的或约。在这种情况下,它会扩展为 false or $id == "valueA" or $id == "valueB"。
如果你更喜欢一口气搞定,你可以写
echo "$input" | jq -M '.elements = [.elements[] | select(.VPCZoneIdentifier as $id | ("'"$selected_subnets"'" | split(" ")) | reduce .[] as $v (false; . or $id == $v))]'
除了$selected_subnets 的拆分是内联完成的之外,它的工作原理基本相同。