Linux二维数组值设置异常:仅[0,1]元素值访问不符预期
问题根源:Shell里根本没有「真正的二维数组」
你遇到的问题本质是被Bash的数组语法误导了——Bash(以及绝大多数POSIX兼容的Shell)并没有原生支持二维数组。你写的data[i,j]这种写法,本质是把"i,j"当成了关联数组的单个字符串键,而不是二维坐标。
具体到你的场景:
看你循环里的输出语句:
echo "while=${group_member_total_count}, ${j}, ${data[${group_member_total_count}, ${j}]}"
当group_member_total_count=0、j=1时,数组访问的键是0,1(注意逗号和数字之间没有空格),这时候你确实给data[0,1]赋值了1025。
但你直接访问的时候写的是:
echo "${data[0, 1]} ,${data[1, 1]}"
这里的键是0, 1(逗号后面多了个空格)——在关联数组里,"0,1"和"0, 1"是两个完全不同的字符串键!后者从来没被赋值过,自然拿不到1025。
怎么验证?
执行declare -p data命令,它会打印出整个数组的所有键值对,你会看到类似这样的输出:
declare -A data=([0,0]="2" [0,1]="1025" [0,2]="0" [1,0]="2" [1,1]="1" ...)
里面只有0,1这个键,根本没有0, 1,这就是问题所在。
解决办法
统一键的格式:不管是赋值还是访问,逗号前后都不要加空格。比如直接访问时改成:
echo "${data[0,1]} ,${data[1,1]}"就能正确拿到1025了。
用一维数组模拟二维(更可靠):如果不想依赖关联数组的字符串键,可以用整数索引计算的方式模拟二维数组,比如先定义列数
cols=7,然后用data[$i*$cols + $j]来访问第i行第j列的元素,这样就完全避免了键格式的问题。
内容的提问来源于stack exchange,提问作者P.Lonnie
相关产品推荐
相关产品推荐

