这个问题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
错误。
答案 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}"