Shell脚本出现value too great for base错误(令牌168a)求解决方案
问题分析与解决方案
错误原因
你的循环逻辑存在核心错误:
for i in "${data[@]}"会将数组data的每个元素值赋值给变量i,而非数组的索引(0、1、2这类整数)。- 执行
echo "${data[i]}"时,bash会把i的当前值(比如f1bfab2e-168a-4da7-9677-5018e5f97g0f)当作数组索引解析,但bash数组索引必须是整数,因此它会尝试将这个字符串转为算术表达式求值:
字符串中的-168a会被识别为负数,bash尝试解析168a为数字——但168里的8不符合八进制规则(八进制仅允许0-7),a也不是十进制合法字符,最终触发value too great for base错误。
你尝试的变量间接引用${data[${!i}]}逻辑也不对:${!i}是读取变量名为i当前值的变量内容,比如i是abc123,它会去读未定义的变量abc123,bash会把空值当作索引0,所以每次都输出数组第一个元素。
正确写法
根据你输出数组所有元素的需求,有两种简单的解决方式:
方式1:直接遍历元素输出
既然循环已经拿到每个元素,直接输出i即可,无需再从数组取值:
data=($( jq -r '.data' data.json | tr -d '[]," ' )) for i in "${data[@]}"; do echo "$i" done
方式2:遍历数组索引
如果需要用到索引值,可以用整数循环的写法:
data=($( jq -r '.data' data.json | tr -d '[]," ' )) for ((i=0; i<${#data[@]}; i++)); do echo "${data[i]}" done
补充说明
168a本身没有特殊意义,错误只是因为bash把它当作数字解析时,既不符合十进制(包含非法字符a)也不符合八进制(包含非法数字8),导致解析失败。
内容的提问来源于stack exchange,提问作者earthseed
相关产品推荐
相关产品推荐

