bash - 在 bash 中获取具有变量名的数组的键

标签 bash

在我的 bash 脚本中,我有两个数组。根据某些逻辑,将使用一个或另一个,因此我在变量 varName 中获取所需数组的名称。我肯定可以用下面的代码得到这个数组的值,但是有没有办法得到它的键?尝试了几种选择,但没有成功。

declare -A foo=([a]=b [c]=d)
declare -A bar=([e]=f [g]=h)

varName=foo
varArray=$varName[@]
echo ${!varArray}

谢谢。

最佳答案

不幸的是,必须求助于 eval。为了安全起见,请确保 varName 只是一个有效的标识符。

[[ varName =~ ^[a-zA-Z_][a-zA-Z_0-9]+$ ]] && eval "echo \${!$varName[@]}"

eval 是提供第二轮解析和评估所必需的。在第一轮中,shell 执行通常的参数扩展,导致字符串 echo ${!foo[@]} 作为单个参数传递给 eval。 (特别是,第一个美元符号被转义,因此按字面意义传递;$varName 扩展为 foo;引号作为引号删除的一部分被删除。eval 然后解析那个 字符串并对其求值。

$ eval "echo \${!$varName[@]}"
#       echo  ${!foo     [@]}
#  The above is the argument that `eval` sees, after the shell
#  does the normal evaluation before calling `eval`. Parameter
#  expansion replaces $varName with foo and quote removal gets
#  rid of the backslash before `$` and the double quotes.
a c

如果您使用的是 bash 4.3 或更高版本,您可以使用 nameref。

declare -n varName=foo
for key in "${!varName[@]}"; do
    echo "$key"
done

关于bash - 在 bash 中获取具有变量名的数组的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30548972/

相关文章:

linux - 将变量导出到另一个脚本

linux - 如果未安装,如何绕过 IncrediBuild 控制台?

bash - 什么是无效的间接扩展,为什么它会阻止我安装这个程序?

arrays - For 循环打印两个 $values 而不是一个

linux - 如果 eth0 关闭/启动,如何发送不同的 SNMP 陷阱?

Linux - 如何在不使用find的情况下删除目录中的所有文件

linux - 如何在 Linux/Unix 上永久设置 $PATH

linux - 如何使用 sed 将文本插入到文件的第一行?

bash - 如何将一个列表(例如 2 和 3)上的数字与另一个列表(例如 5)上的近似和相匹配?

bash - 从另一个目录获取 bash 文件并返回当前目录的别名