很容易找到以下示例:
还有另一种分配数组变量的方式...
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。为什么会发生这种情况,我该如何解决?
谢谢。
答案 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