Bash,在调用value时使用变量作为关联数组的名称

时间:2016-09-02 17:04:24

标签: arrays bash associative-array

这个问题bad substitution shell- trying to use variable as name of array做了类似于我需要的东西但是对于数组。我非常擅长打击脚本,我需要的是做这样的事情:

# input
humantocheck="human1"

declare -A human1
declare -A human2

human1=( ["records_file"]="xxxxx.txt")
human2=( ["records_file"]="yyyyy.txt")

echo ${$humantocheck[records_file]}

预期输出:

xxxxx.txt

但是,当我尝试这个时,我收到bad substitution错误。

2 个答案:

答案 0 :(得分:4)

这正是bash 4.3特性namevars(从ksh93借来的)旨在解决的问题。 Namevars允许赋值,而不是单独查找,因此比${!foo}语法更灵活。

# input
humantocheck="human1"

declare -A human1=( ["records_file"]="xxxxx.txt" )
declare -A human2=( ["records_file"]="yyyyy.txt" )

declare -n human=$humantocheck # make human an alias for, in this case, human1
echo "${human[records_file]}"  # use that alias
unset -n human                 # discard that alias

有关关联数组和间接扩展的全面讨论,请参阅BashFAQ #6

答案 1 :(得分:2)

使用间接引用执行此操作的一种方法是:

ref=$humantocheck[records_file]
echo ${!ref}

Bash: Indirect Expansion Exploration是在Bash中间接访问变量的绝佳参考。

请注意,echo命令旨在对原始代码进行最小修改,但在几个方面是不安全的。一个安全的选择是:

printf '%s\n' "${!ref}"

请参阅Why is printf better than echo?