如何在shell脚本中修改2d数组

时间:2016-09-22 05:34:34

标签: 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.

但是当我运行脚本时,结果是:

$ ./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。我的剧本有问题吗?

1 个答案:

答案 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

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" )'

这似乎就是你所需要的。