使用 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"