在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
相关产品推荐
相关产品推荐

