Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在shell脚本中修改二维数组_Arrays_Bash_Shell_Sh - Fatal编程技术网

Arrays 如何在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 但当我

我的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。我的脚本有问题吗?

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