如何在Bash中为动态关联数组分配一个值?

5

假设我们有一个像这样的Bash 4脚本:

1: arr='my_array';
2: declare -A "${arr}";
3: my_array[foo]='This is foo';
4: arrfoo="${arr}[foo]";
5: echo "${!arr}";

输出结果为:

This is foo

但需要注意的是,尽管数组my_array是动态声明的(第二行),我使用它的直接名称(第三行)为其赋值(在索引foo下)。

我找不到通过动态名称(即在此情况下通过${arr}变量)为关联数组分配值的语法。因为你可以动态声明数组,所以这种方式可行吗?类似于以下结构:

declare -A "${arr}"=(
    [foo]='This is foo'
);

仅仅不工作。

1个回答

8
您可以直接使用declare
$ arr=my_array
$ declare -A "$arr"
$ declare "$arr[foo]=bar"
$ echo "${my_array[foo]}"
bar

这提供了您所需的间接引用。参数$arr[foo]=bar被扩展为my_array[foo]=bar,这是一个有效的赋值表达式,可以由declare处理。

如果键需要加引号,你会怎么做?例如:declare "$arr[$key]=$val",其中$key是一个MAC地址。我已经尝试了所有可能的引号技巧。 - aktivb
你认为还需要进一步引用什么? - chepner
这不是引用问题,而是作用域问题。如果在具有全局关联数组的函数中尝试执行上述操作,则declare需要-g标志才能分配给它,否则它将尝试创建同名的本地索引数组,并通过将其评估为算术表达式来“转换”键为数字值。由于任何有效变量名称的“键”都将计算为0,因此它不会报告任何错误,但MAC地址不是,因此bash将错误令牌报告为去掉前两个十六进制数字的地址,导致我认为引用是问题所在。 - aktivb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接