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

在Bash中不使用jq解析Curl返回的JSON子数组并遍历

在无jq的Bash环境中解析JSON子数组并遍历

问题场景

生产服务器无法安装jq工具,通过grep提取JSON返回的list子数组内容后,无法将其转为Bash数组进行遍历。当前提取结果为["value1","value2","value3","value4"],直接用IFS=','分割会保留方括号和引号,导致遍历结果不符合预期。

解决方案

步骤1:清理提取到的数组字符串

先处理grep返回的结果,去除空字节(解决ignored null byte警告)、首尾方括号和双引号:

# Step3 提取并清理list数组内容
TEST=$(grep -zoP '"list":\s*\K[^\s]*(?=\s*,)' test.json | tr -d '\0' | sed -e 's/^\[\(.*\)\]$/\1/' -e 's/"//g')
  • tr -d '\0':移除grep -z参数引入的空字节,消除警告
  • sed -e 's/^\[\(.*\)\]$/\1/':去掉首尾的[和]
  • sed -e 's/"//g':移除所有双引号,得到纯值字符串value1,value2,value3,value4

步骤2:转为Bash数组并遍历

用IFS=','分割清理后的字符串,生成数组并遍历:

# Step4 转为数组并遍历
IFS=',' read -ra ADDR <<< "$TEST"
for i in "${ADDR[@]}"; do
  echo "$i"
done

执行后会输出:

value1
value2
value3
value4

可选:保留引号的处理方式

如果需要保留值的引号,只去掉首尾方括号即可:

TEST=$(grep -zoP '"list":\s*\K[^\s]*(?=\s*,)' test.json | tr -d '\0' | sed 's/^\[\(.*\)\]$/\1/')
IFS=',' read -ra ADDR <<< "$TEST"
for i in "${ADDR[@]}"; do
  echo "$i"  # 输出带引号的value1、value2等
done

内容的提问来源于stack exchange,提问作者Astro-Otter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:36:25