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。

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

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

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

例如:

$ 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(着重号是后加的):

如果任何变量是 分配给使用语法名称[下标]=值。 下标是 视为算术表达式 必须计算为一个数字。 如果下标的计算结果小于零的数字,则将其用作大于 1 的偏移量 数组的最大索引(因此 -1 的子订阅是指数组的最后一个元素)。 要显式声明索引数组,请使用声明 -a name ....

相关内容

  • 没有找到相关文章

最新更新