Bash脚本“分配数组变量的另一种方法”

时间:2019-02-23 23:09:42

标签: arrays variables

很容易找到以下示例:

  

还有另一种分配数组变量的方式...

     

array_name =([xx] = XXX [yy] = YYY ...)

然后他们举了一个简单的例子。

所以,如果我这样做:

REM=( [a]=x [1]=y )
echo ${REM[a]}
echo ${REM[1]}

根据需要返回x和y。

但如果我这样做:

REM=( [a]=x [b]=y )
echo ${REM[a]}
echo ${REM[b]}

它返回y和y。为什么会发生这种情况,我该如何解决?

谢谢。

1 个答案:

答案 0 :(得分:0)

那是因为您的第二个示例只有一个键,即零。如果你回显它的键,你会看到这个:

pax> echo ${!REM[@]}
0

此外,如果您回显第一个示例的键,您将看到 0 1不是 a 1,正如您所期望的那样。

这与 bash 手册页中的这个小片段有关(我的重点):

<块引用>

索引 数组会在使用语法 name[subscript]=value 分配任何变量时自动创建。下标被视为算术表达式,必须计算为数字。

但是你不想要一个索引数组,因为那里的键必须是数字。您需要一个 associative 数组,其中的键可以是字符串,解决方案可以在同一个手册页中找到:

<块引用>

要显式声明索引数组,请使用 declare -a name。关联数组是使用 declare -A name 创建的。

因此,您应该使用:

pax> declare -A REM            # Force associative array, not indexed,
pax> REM=( [a]=1 [b]=42 )      # so that keys are strings.

pax> echo ${!REM[@]}           # Keys now correct (though arbitrary order).
b a

pax> echo ${REM[a]}:${REM[b]}  # Values correct as well.
1:42