Json 如何使用jq迭代对象数组

Json 如何使用jq迭代对象数组,json,bash,jq,Json,Bash,Jq,我有一个javascript文件,它打印对象的JSON数组: //myfile.js输出 [ {“id”:1,“name”:“blah blah”,…}, {“id”:2,“name”:“xxx”,…}, ... ] 在我的bash脚本中,我希望遍历每个对象 我试过跟随,但不起作用 #/bin/bash 输出=$(myfile.js) 对于$(echo${output}jq-c'.[])中的行;做 echo$行 完成 您正试图将myfile.js作为命令调用。你需要这个: output=$(c

我有一个javascript文件,它打印对象的JSON数组:

//myfile.js输出
[
{“id”:1,“name”:“blah blah”,…},
{“id”:2,“name”:“xxx”,…},
...
]
在我的bash脚本中,我希望遍历每个对象

我试过跟随,但不起作用

#/bin/bash
输出=$(myfile.js)
对于$(echo${output}jq-c'.[])中的行;做
echo$行
完成

您正试图将
myfile.js
作为命令调用。你需要这个:

output=$(cat myfile.js)
与此相反:

output=$(myfile.js)
但即使如此,如果数据中有空格,您当前的方法也不会很好地工作(根据您发布的示例,它确实有空格)。我建议采取以下备选方案:

jq -c '.[]' < myfile.js |
while read -r row
do
  echo "$row"
done
编辑: 如果您的数据来自上一个流程调用,例如您的案例中的
mongo
,您可以将其直接通过管道传输到
jq
(以保持可移植性),如下所示:

mongo myfile.js |
jq -c '.[]' |
while read -r row
do
  echo "$row"
done
我如何使jq-c“[]”<(mongomyfile.js)工作

在bash shell中,您可以沿以下行编写表达式:

while read -r line ; do .... done < <(mongo myfile.js | jq -c .[])

然后,
中任何变量的绑定都将丢失。

在迭代每个项目时,您希望存档什么?我相信大部分内容都可以在一次调用中归档
jq
对不起,我觉得我写的文章很混乱。javascript文件在mongo shell中执行,因此,这就是我将输出存储在变量中的原因。output=$(mongo myfile.js)。如何使jq-c“[]”<(mongo myfile.js)工作?您只需要将该输出直接传送到
jq
,请参阅更新的示例。
while read -r line ; do .... done < <(mongo myfile.js | jq -c .[])
... | while read -r line ; do .... done