Bash中使用间接扩展访问关联数组时如何获取对应键名?
Bash关联数组间接扩展获取键名的实现方法
Bash 原生支持该需求,只需要调整间接扩展的表达式构造规则即可,获取关联数组键的原生语法为${!数组名[@]},对应到动态前缀的场景适配即可。
方案1:兼容Bash 4.0+的传统间接扩展写法
#! /usr/bin/bash declare -A fruit_colour fruit_colour["apple"]="red" fruit_colour["banana"]="yellow" fruit_colour["durian"]="green" declare -A thing_colour thing_colour["keyboard"]="black" thing_colour["shirt"]="red" thing_colour["desk"]="white" target="thing" # 可替换为 "fruit" # 构造键的间接扩展表达式 key_expr="!${target}_colour[@]" # 构造数组名前缀,用于后续取单值 arr_name="${target}_colour" # 遍历所有键 for key in ${!key_expr}; do # 间接获取当前键对应的值 value="${!arr_name[$key]}" echo "键: $key, 值: $value" done
运行输出如下:
键: desk, 值: white 键: shirt, 值: red 键: keyboard, 值: black
方案2:Bash 4.3+ 更简洁的名称引用(nameref)写法
如果运行环境Bash版本高于等于4.3,可以用名称引用语法简化代码,可读性更高:
#! /usr/bin/bash declare -A fruit_colour fruit_colour["apple"]="red" fruit_colour["banana"]="yellow" fruit_colour["durian"]="green" declare -A thing_colour thing_colour["keyboard"]="black" thing_colour["shirt"]="red" thing_colour["desk"]="white" target="thing" # 给目标关联数组起别名 declare -n curr_arr="${target}_colour" # 直接按普通关联数组的语法操作即可 for key in "${!curr_arr[@]}"; do echo "键: $key, 值: ${curr_arr[$key]}" done
注意事项
- 如果数组值包含空格、特殊字符,所有变量建议包裹双引号,避免分词异常
- 关联数组本身为Bash 4.0版本新增特性,运行环境需要满足版本要求
内容的提问来源于stack exchange,提问作者YYX
相关产品推荐
相关产品推荐

