我的期望是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。
答案 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 ....