如何在不使用eval与临时文件的情况下声明并初始化名称含变量的关联数组?
无需eval或source创建带变量名的Bash关联数组
在Bash中创建名称包含变量的关联数组时,直接使用declare -A tab$i=(...)会失效,依赖eval又存在安全风险。可以利用Bash 4.3及以上版本提供的**名称引用(nameref)**特性解决这个问题,无需eval或临时文件source操作。
声明并初始化动态命名的关联数组
for i in {1..3}; do # 建立名称引用,让arr指向tab$i这个动态生成的数组名 declare -n arr="tab$i" # 通过引用变量声明关联数组并完成初始化 declare -A arr=( [nom]="john" [comment]="this works!" ) # 解除名称引用,避免后续操作误修改已有数组 unset -n arr done # 验证结果 echo "${tab1[nom]}" # 输出 john echo "${tab2[comment]}" # 输出 this works!
给已存在的动态数组赋值
如果已经提前声明了数组,也可以通过名称引用直接赋值:
# 先批量声明关联数组 for i in {1..3}; do declare -A "tab$i" done # 通过名称引用赋值 for i in {1..3}; do declare -n arr="tab$i" arr[age]="30" unset -n arr done echo "${tab3[age]}" # 输出 30
注意事项
- 该特性要求Bash版本≥4.3,可通过
bash --version检查当前版本。 - 使用完名称引用后,建议用
unset -n解除引用,防止后续复用变量名时意外修改之前的数组。
内容的提问来源于stack exchange,提问作者Denis M
相关产品推荐
相关产品推荐

