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