如何转义关联数组中带有连字符的键

时间:2019-04-16 14:12:24

标签: linux bash dictionary

我想在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")

还有其他创建地图的方法吗?

1 个答案:

答案 0 :(得分:4)

正如Wumpus在评论中所指出的那样,问题在于,当您明确需要关联数组时,您已经声明了一个常规的,数字索引的array。在数字索引数组的上下文中,索引为arithmetic expressions,这可能导致混乱的错误,或者在您可能期望有错误的情况下没有错误!

$ declare -a foo
$ foo[abc-def]=bar

这是合法的,但没有将“ bar”分配给索引“ abc-def”。它将“ bar”分配给索引0,这是abcdefabc-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!