如何在bash中调用jq将返回的值存储在变量中

时间:2019-08-20 09:50:01

标签: bash jq

我正在尝试通过将对象读取到bash脚本变量中来读取json文件并从中获取单个对象。

这就是我希望做到的:

search_command="'.defines[] | select(.id==$current_id)'"
echo $search_command
out_json=`jq $search_command source.json`

其中current_id是具有先前读取的id值的变量。当我运行此脚本时,“调试回显”的输出为预期值:

'.defines[] | select(.id==2)'

但是之后,我收到此消息:

jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
'.defines[]
jq: 1 compile error

当我使用以下参数在终端中直接拨打电话时

jq '.defines[] | select(.id==2)' source.json

我看到了期望的输出。

我对bash脚本还很陌生,所以我只能猜测不是jq部分是问题的根源,而是我尝试在bash中调用它的方式。我曾尝试删除search_command内的空格,但是并没有太大变化(这次错误消息中包含search_command的全部内容,因此我猜想这个更有效,但仍然不够有效。

2 个答案:

答案 0 :(得分:1)

在定义search_command时不要使用单引号,而在引用时将其用双引号引起来,例如:

search_command=".defines[] | select(.id==$current_id)"
out_json="$(jq "$search_command" source.json)"

答案 1 :(得分:0)

与任何其他语言一样,请勿使用字符串插值来定义命令。将current_id作为参数传递给 static 过滤器。

search_command='.defines[] | select(.id==$x)'
out_json=$(jq --argjson x "$current_id" "$search_command" source.json)