使用 eval 执行 jq
using eval to execute jq
我正在尝试 运行 循环中的 jq 过滤器,从另一个文件的列表中获取我正在匹配的键值。
while read line
do
jqfilter="jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "Name"}, {Value: "$line"}]}))' describe-instances.json"
eval "$jqfilter";
done < "./list"
循环正在运行,$line
正在被替换为适当的值。
问题出在 {Key: "Name"}
,eval 去除了 NAME 周围的引号,因此 jq 过滤器不起作用。
正如 Jeff 指出的那样,如果
可能,但即使无法避免循环,eval 绝对可以而且可能应该是,无论是为了效率还是
以避免并发症。
例如,我怀疑您可以简单地写:
jq --arg line "$line" '
.Reservations[].Instances[]
| select(contains({Tags: [{Key: "Name"}, {Value: $line}]}))
' describe-instances.json
谢谢高峰,几个小的编辑和你的建议完美无缺
while read line
do
jq --arg line "$line" '.Reservations[].Instances[] | select(contains({Tags: [{Key: "Name"}, {Value: "line"}]}))' describe-instances.json;
done < "./instances-names"
我正在尝试 运行 循环中的 jq 过滤器,从另一个文件的列表中获取我正在匹配的键值。
while read line
do
jqfilter="jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "Name"}, {Value: "$line"}]}))' describe-instances.json"
eval "$jqfilter";
done < "./list"
循环正在运行,$line
正在被替换为适当的值。
问题出在 {Key: "Name"}
,eval 去除了 NAME 周围的引号,因此 jq 过滤器不起作用。
正如 Jeff 指出的那样,如果 可能,但即使无法避免循环,eval 绝对可以而且可能应该是,无论是为了效率还是 以避免并发症。
例如,我怀疑您可以简单地写:
jq --arg line "$line" '
.Reservations[].Instances[]
| select(contains({Tags: [{Key: "Name"}, {Value: $line}]}))
' describe-instances.json
谢谢高峰,几个小的编辑和你的建议完美无缺
while read line
do
jq --arg line "$line" '.Reservations[].Instances[] | select(contains({Tags: [{Key: "Name"}, {Value: "line"}]}))' describe-instances.json;
done < "./instances-names"