我的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.
但是当我运行脚本时,结果是:
$ ./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。我的剧本有问题吗?
答案 0 :(得分:1)
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
除非使用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
它始终是返回的最后一个值。
让我们来看看关联数组会发生什么。我们将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" )'
这似乎就是你所需要的。