Bash使用jq遍历JSON数组提示Cannot index array with string报错如何解决
报错原因
- 核心原因:
--arg参数给jq传递的变量默认是字符串类型,而JSON数组只能用数字作为索引下标,用字符串"1"、"2"去索引数组就会触发该报错。 - 额外隐患:JSON数组索引从0开始计数,你当前脚本用
seq 1 10生成的下标从1开始,会跳过数组第一个元素,还可能因为数组长度不足10触发越界报错。你已经通过jq取了数组长度m,不应该硬编码遍历范围。
修复方案
方案1:最小改动适配原有逻辑
有两种等价的修改方式,二选一即可:
- 把传入的字符串参数转成数字类型
- 改用
--argjson参数直接传递数字类型变量
同时修正数组遍历的下标范围,适配0起始的索引规则:
#!/bin/bash m=$(jq '.items.item | length' try4.json) # 数组下标从0开始,遍历范围是0到m-1 for i in $(seq 0 $((m-1))); do # 写法1:转字符串为数字 jq --raw-output --arg v "$i" '.items.item[($v | tonumber)].request.text' try4.json | base64 --decode | sed '1q;d' | awk '{print $2}' # 写法2:用argjson直接传数字,不用转类型 # jq --raw-output --argjson v "$i" '.items.item[$v].request.text' try4.json | base64 --decode | sed '1q;d' | awk '{print $2}' done
方案2:更高效的无循环实现
不需要用bash循环反复读取JSON文件,直接用jq内置的数组遍历功能一次性处理所有元素,大体积JSON场景下性能提升非常明显:
#!/bin/bash jq --raw-output '.items.item[].request.text' try4.json | while read -r b64_str; do echo "$b64_str" | base64 --decode | sed '1q;d' | awk '{print $2}' done
内容的提问来源于stack exchange,提问作者zexapod
相关产品推荐
相关产品推荐

