我想在bash中创建一个地图,其中某些地图键的值可能包含连字符(-
)
我尝试了以下代码
declare -a buckets
buckets["us-east-1"]="bucketname-us-east-1";
region="us-east-1"
buckets[$region]="bucketname-us-east-1";
# both of them throws buckets["us-east-2"]: bad array subscript
buckets["us\-east\-1"]="bucketname-us-east-1";
# throws syntax error: invalid arithmetic operator (error token is "\-east\-1")
还有其他创建地图的方法吗?
答案 0 :(得分:4)
正如Wumpus在评论中所指出的那样,问题在于,当您明确需要关联数组时,您已经声明了一个常规的,数字索引的array。在数字索引数组的上下文中,索引为arithmetic expressions,这可能导致混乱的错误,或者在您可能期望有错误的情况下没有错误!
$ declare -a foo
$ foo[abc-def]=bar
这是合法的,但没有将“ bar”分配给索引“ abc-def”。它将“ bar”分配给索引0,这是abc
,def
和abc-def
都扩展为的索引,因为未分配它们。换句话说,您是从0中减去0。
$ echo "${foo[0]}"
bar
如果您尝试避免破折号,则会出现错误,就像您看到的一样。
$ echo $(( abc \- def ))
bash: abc \- def : syntax error: invalid arithmetic operator (error token is "\- def ")
但是您可以在此处使用关联数组:
$ declare -A bar
$ bar[abc-def]=xyzzy
$ echo "${bar[abc-def]}"
xyzzy
这允许您在数组索引中使用字符串,并且它们不解析为算术表达式。
编辑:bad array subscript
起初我没有看到坏数组下标,因为您只能在第一次分配给数组时得到它。
$ unset foo
$ foo[-1]=bad
bash: foo[-1]: bad array subscript
$ foo[0]=whatevz
$ foo[-1]=bad
$ # no error!