使用eval执行jq

时间:2016-02-13 05:23:04

标签: json bash while-loop 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过滤器不起作用。

2 个答案:

答案 0 :(得分:1)

正如杰夫指出的那样,建议你在jq中做所有事情 可能,但即使一个循环无法避免,eval绝对可以而且可能应该是,效率和 避免并发症。

例如,我怀疑你可以写一下:

jq --arg line "$line" '
  .Reservations[].Instances[]
  | select(contains({Tags: [{Key: "Name"}, {Value: $line}]}))
' describe-instances.json

答案 1 :(得分:0)

谢谢你的高峰,一些小编辑和你的建议完美地运作

while read line do jq --arg line "$line" '.Reservations[].Instances[] | select(contains({Tags: [{Key: "Name"}, {Value: "line"}]}))' describe-instances.json; done < "./instances-names"