Bash使用jq解析JSON存数组后遍历出现死循环问题排查
存在的问题
while read循环未指定输入文件源,read命令会持续等待标准输入,表现为无限卡住的异常状态idd、username被定义为普通变量而非数组,每次循环都会覆盖上一次的取值,后续按数组遍历的逻辑完全无法生效- 你的JSON文件是多个独立JSON对象拼接的非标准格式,按行读取的逻辑无法拿到完整的单个JSON结构,直接调用jq解析会报错
修正方案
如果可以调整JSON文件,建议先把多个对象包为标准JSON数组,降低解析复杂度:
[ { "id": 5679162, "username": "ryderw1" }, { "id": 5679163, "username": "ryderw3" }, { "id": 5679164, "username": "ryderw4" } ]
如果无法修改原JSON文件,可直接用jq的-n参数配合inputs读取流格式的多个JSON对象,无需修改原文件,修正后的代码如下:
#!/bin/bash test(){ local file="/Users/f.json" if [ ! -f "$file" ]; then echo "absent" return 1 fi echo "present" # 直接读取所有id存入数组 local -a idd=($(jq -n -r 'inputs.id' "$file")) # 遍历输出 for id in "${idd[@]}"; do echo "$id" done } test
如果需要同时存储username字段,只需用jq同时提取两个字段后逐行存入对应数组即可。
内容的提问来源于stack exchange,提问作者jay
相关产品推荐
相关产品推荐

