【问题标题】:How to modify 2d array in shell script如何在 shell 脚本中修改二维数组
【发布时间】:2017-01-30 13:21:22
【问题描述】:

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

【问题讨论】:

    标签: arrays bash shell sh


    【解决方案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" )'
    

    这似乎是你需要的。

    【讨论】:

    • 谢谢!声明 -A 完成了这项工作。我重新检查了我看到的关于 shell 的 2d 数组的其他帖子,但我忽略了声明
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多