如何在shell脚本中循环遍历jq输出的JSON数组结果
问题原因
你的写法存在两个核心问题:
- jq默认输出的是带格式的完整JSON数组,包含大量换行、空格字符,直接存入shell变量后,for循环会按默认分隔符(空格、换行、制表符)切割所有内容,导致JSON被拆成零散的独立字符串
- 没有将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
相关产品推荐
相关产品推荐

