Arrays 如何在shell脚本中修改二维数组
我的shell脚本有以下示例代码:Arrays 如何在shell脚本中修改二维数组,arrays,bash,shell,sh,Arrays,Bash,Shell,Sh,我的shell脚本有以下示例代码: #!/bin/bash x[1,1]=0 x[2,1]=1 echo "x[1,1]=${x[1,1]}" echo "x[2,1]=${x[2,1]}" for i in {1..2}; do x[$i,1]=${i} echo "loop$i x[$i,1]=${i}" done echo "x[1,1]=${x[1,1]}" echo "x[2,1]=${x[2,1]}" 我期望x[1,1]的值为1,x[2,2]的值为2 但当我
#!/bin/bash
x[1,1]=0
x[2,1]=1
echo "x[1,1]=${x[1,1]}"
echo "x[2,1]=${x[2,1]}"
for i in {1..2}; do
x[$i,1]=${i}
echo "loop$i x[$i,1]=${i}"
done
echo "x[1,1]=${x[1,1]}"
echo "x[2,1]=${x[2,1]}"
我期望x[1,1]的值为1,x[2,2]的值为2
但当我运行脚本时,结果是:
$ ./test3.sh
x[1,1]=1
x[2,1]=1
loop1 x[1,1]=1
loop2 x[2,1]=2
x[1,1]=2
x[2,1]=2
我希望
x[1,1]
保留1的值,但现在正好是2。我的脚本有问题吗?Bash没有二维数组。您所能做的最好的事情就是使用关联数组模拟它们
在脚本开头添加以下行:
declare -A x
这使得x
成为一个关联数组。完成后,脚本将生成您期望的输出:
$ bash script
x[1,1]=0
x[2,1]=1
loop1 x[1,1]=1
loop2 x[2,1]=2
x[1,1]=1
x[2,1]=2
Bash索引数组
除非使用declare-A
,否则bash数组只是一个索引数组。让我们将y
定义为索引数组:
$ y=()
现在,让我们指定两个值:
$ y[2,3]=1
$ y[22,3]=2
现在,让我们使用declare-p
来了解数组的真正内容:
$ declare -p y
declare -a y='([3]="2")'
如您所见,只有y[3]
。原因是索引数组中的索引要进行算术展开,当给定逗号分隔值列表时,算术展开只返回最后一个值
换句话说,就bash而言,对y[2,3]
和y[22,3]
的赋值都只是对y[3]
的赋值。第二个赋值覆盖第一个赋值
如果我们响应算术展开的结果,我们可以直接看到这一点:
$ echo $((3))
3
$ echo $((2,3))
3
$ echo $((22,3))
3
当给定逗号分隔值列表时,算术展开返回最后一个值。即使逗号分隔的列表很长,也是如此:
$ echo $((1+2,3*4,5,6,7,8))
8
它始终是返回的最后一个值
Bash关联数组
让我们看看关联数组会发生什么。让我们将z
定义为关联数组,并为其指定一些值:
$ declare -A z
$ z[1,2]=1
$ z[3,4]=2
$ z["Jim Bob"]=3
现在,让我们看看z
中存储了什么:
$ declare -p z
declare -A z='([3,4]="2" ["Jim Bob"]="3" [1,2]="1" )'
这似乎正是您需要的。谢谢!declare-A完成了任务。我重新检查了我看到的关于shell的2d数组的其他帖子,我忽略了declare