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

Bash使用jq遍历JSON数组提示Cannot index array with string报错如何解决

报错原因
  • 核心原因:--arg 参数给jq传递的变量默认是字符串类型,而JSON数组只能用数字作为索引下标,用字符串"1"、"2"去索引数组就会触发该报错。
  • 额外隐患:JSON数组索引从0开始计数,你当前脚本用seq 1 10生成的下标从1开始,会跳过数组第一个元素,还可能因为数组长度不足10触发越界报错。你已经通过jq取了数组长度m,不应该硬编码遍历范围。
修复方案

方案1:最小改动适配原有逻辑

有两种等价的修改方式,二选一即可:

  1. 把传入的字符串参数转成数字类型
  2. 改用--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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:06:05