我们有一个项目,其中在文件中声明了 Bash 关联数组,例如 def.sh,如下所示
#!/bin/bash
declare -a map=(
["Key_A"]='Val_A'
["Key_B"]='VAL_B'
)
此文件在终端上通过
source def.sh
获取,然后像这样访问各个元素
export var_a="xyz"
var_b="${map[${var_a}]}"
之所以这样做,与我们正在使用的内部系统和项目的要求有关。
早些时候,当地图只有一个条目时,这工作得很好。
当我们向映射添加第二个条目时(即,当它看起来像上面的代码片段时),该映射始终返回第二个/最后一个条目/对的值。
也就是说,即使我们这样做
export var_a="Key_A"
var_b="${map[${var_a}]}"
echo ${var_b}
给出 VAL_B
。不用说,"${map[KEY_B]}"
仍然给出VAL_B
。
我们尝试过不带引号和不带引号的参数替换(即
"${map[KEY_A]}"
),结果是相同的。
知道为什么会发生这种情况吗?
既然你想使用字符串作为索引,你应该使用
declare -A
:
$ declare -A map=(["Key_A"]='Val_A' ["Key_B"]='VAL_B')
$ export var_a="Key_A"
$ echo "${map[${var_a}]}"
Val_A