在我的 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/