Bash数组键与现有变量冲突

时间:2015-04-27 21:50:55

标签: arrays bash

我的期望是bash数组中的键被解释为文字,但似乎并非如此。例如,以下按预期工作:

$ declare -a mymap
$ mymap[foo]="bar"

没问题,我们现在有一个带有键的数组,字面上是"foo"。但是当我设置一个与键同名的环境变量时,我在其中放入了特殊字符,它会产生一个解析错误:

$ declare -a mymap
$ export foo=" > "
$ mymap[foo]="bar"
-bash: >: syntax error: operand expected (error token is ">")
$ mymap["foo"]="bar"
-bash: >: syntax error: operand expected (error token is ">")
$ mymap['foo']="bar"
-bash: >: syntax error: operand expected (error token is ">")

任何人都可以解释我在这里失踪的内容吗?我使用bash版本4.3.33。

2 个答案:

答案 0 :(得分:5)

使用-A声明带字符串键的关联数组。 -a创建一个索引数组,其键在算术上下文中计算。

$ declare -A mymap
$ export foo=' > '
$ mymap[foo]="bar"
$ echo "${mymap[foo]}"
bar
$ declare -p mymap
declare -A mymap='([foo]="bar" )'

答案 1 :(得分:1)

根据算术表达式的规则评估数组下标。这意味着,对于一件事,对于变量名称,隐含$

例如:

$ b=1; c=2; mymap[b+c]=sum
$ declare -p mymap
declare -a mymap='([3]="sum")' 

您遇到的问题是>不是有效的算术表达式。虽然>无效,但2>1有效。观察:

$ export foo=" 2>1 "
$ mymap[foo]="bar"
$ declare -p mymap
declare -a mymap='([1]="bar" [3]="sum")'

文档

来自man bash(强调补充):

  

如果有任何变量,则会自动创建索引数组   分配给使用语法name [subscript] = value。 下标是   被视为算术表达式          必须评估为数字。如果下标的计算结果小于零,则将其用作大于0的偏移量。   数组的最大索引(所以-1的子标点指的是数组的最后一个元素)。要显式声明索引数组,请使用declare -a name ....