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

时间:2015-05-30 17:07:16

标签: bash

在我的bash脚本中,我有两个数组。根据某些逻辑,将使用一个或另一个逻辑,因此我在变量a = [10 for i in range(10000)] def b(): for c in a: d = c ** c ^ c ** c b() 中获取所需数组的名称。我可以使用下面的代码获取此数组的值,但有没有办法获得它的键?试过几个选项,但没有运气。

a

感谢。

1 个答案:

答案 0 :(得分:3)

不幸的是,并非没有诉诸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