【问题标题】:using eval to execute jq使用eval执行jq
【发布时间】:2016-05-24 10:03:00
【问题描述】:

我正在尝试在循环中运行 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 过滤器不起作用。

【问题讨论】:

  • 为什么首先使用 eval?为什么不直接调用 jq 呢? p.s.,注意它在问题中的颜色,你试图将双引号放在双引号字符串中,它应该被转义。
  • 转义引号起到了作用,谢谢。

标签: json bash while-loop jq


【解决方案1】:

正如 Jeff 指出的那样,建议在 jq 中执行所有操作,如果 可能,但即使无法避免循环,为了效率和 避免并发症。

例如,我怀疑你可以简单地写:

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

【讨论】:

    【解决方案2】:

    谢谢你的峰,几个小的修改和你的建议完美的工作

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

    【讨论】:

    • (1)describe-instances.json中有多少个顶级实体?如果只有一个,那么您可以消除 while 循环。 (2) 您显示的 jq 过滤器不包含 $line ,因此不正确。
    猜你喜欢
    • 2017-09-16
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多