Linux 如何在关联数组中转义具有连字符的键

Linux 如何在关联数组中转义具有连字符的键,linux,bash,dictionary,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\-e

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

有没有其他方法来创建地图?

正如Wumpus在评论中所说的,问题是您已经声明了一个常规的数字索引,而您显然需要一个关联数组。在数字索引数组的上下文中,索引是,这可能会导致混淆错误,或者在您可能期望出现错误时没有错误

$ declare -a foo
$ foo[abc-def]=bar
这是合法的,但不会将“bar”指定给索引“abc def”。它将“条”分配给索引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
这允许您在数组索引中使用字符串,而它们不会解析为算术表达式

编辑:
错误的数组下标

一开始我没有看到坏的数组下标,因为只有在数组的第一次赋值时才看到

$ unset foo
$ foo[-1]=bad
bash: foo[-1]: bad array subscript

$ foo[0]=whatevz
$ foo[-1]=bad
$ # no error!

-a
用于常规数组(整数索引)<代码>-A用于关联数组。我已经尝试过了,很抱歉我没有弄清楚我使用的是mac os high sierra,看起来-一个选项适用于bash V4,可能是Brilliant的副本!另一方面,您可能需要强调一个事实,即变量展开和算术运算确实发生在数组索引操作符内部,即使索引在
“us-east-1”
中被双引号引用。扩展到
0-0-1
的变量
us
east
尚未赋值。由于负索引只能用于访问元素而不能写入值,因此op得到了一个
错误下标。如果只是
“美国东部”
,op就会逃之夭夭。这对我来说确实是一个新的启示:-)。如果我错了,请纠正我。