You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在shell脚本中循环遍历jq输出的JSON数组结果

问题原因

你的写法存在两个核心问题:

  1. jq默认输出的是带格式的完整JSON数组,包含大量换行、空格字符,直接存入shell变量后,for循环会按默认分隔符(空格、换行、制表符)切割所有内容,导致JSON被拆成零散的独立字符串
  2. 没有将jq返回的数组拆分为单个元素逐行输出,shell无法识别哪些内容属于同一个字典
解决方案

第一步调整jq命令,增加-c参数压缩输出JSON,同时在命令末尾加[]把结果数组拆分为单个元素逐行输出:

# 调整后的jq命令,每行输出一个完整的JSON字典
cat ernst.json | jq -cn --stream '[fromstream(inputs | (.[0] | index("data")) as $ix | select($ix) | .[0] |= .[$ix:])][]'

第二步用while read逐行读取输出,避免分隔符拆分问题,同时用进程替换规避管道子shell的变量作用域问题,完整脚本如下:

#!/bin/bash
while IFS= read -r d
do
    echo "$d"
    # 此处可添加针对单个字典的处理逻辑,如需解析字段可直接将$d传给jq处理
done < <(cat ernst.json | jq -cn --stream '[fromstream(inputs | (.[0] | index("data")) as $ix | select($ix) | .[0] |= .[$ix:])][]')

执行后会逐行打印2个完整的data字典,完全符合预期。

内容的提问来源于stack exchange,提问作者CYC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:06:03