如何在Bash中通过变量访问关联数组元素
Bash脚本通过参数指定关联数组和键取值的实现方法
你原来尝试的${$1[$2]}写法在Bash中不生效,因为Bash不支持直接嵌套解析变量名。可以通过以下两种方式实现需求:
方法一:使用名称引用(Bash 4.3+ 推荐)
利用Bash的declare -n特性创建数组的名称引用,直接通过引用操作目标数组:
#!/bin/bash declare -A first declare -A second first=([ele]=value [elem]=valuee [element]=valueee) second=([ele]=foo [elem]=fooo [element]=foooo) # 检查参数数量是否正确 if [ $# -ne 2 ]; then echo "用法: $0 <数组名> <元素键>" exit 1 fi # 创建目标数组的名称引用 declare -n target_arr="$1" # 可选:检查数组是否存在 if ! declare -p "$1" &>/dev/null; then echo "错误:数组 '$1' 不存在" exit 1 fi # 可选:检查键是否存在于数组中 if [[ ! -v target_arr[$2] ]]; then echo "错误:数组 '$1' 中不存在键 '$2'" exit 1 fi # 输出对应值 echo "${target_arr[$2]}"
执行示例:
sh.sh second elem
输出:fooo
方法二:使用间接引用(兼容旧版本Bash)
通过构造间接引用的变量名格式,利用Bash的间接扩展特性取值:
#!/bin/bash declare -A first declare -A second first=([ele]=value [elem]=valuee [element]=valueee) second=([ele]=foo [elem]=fooo [element]=foooo) if [ $# -ne 2 ]; then echo "用法: $0 <数组名> <元素键>" exit 1 fi # 构造间接引用的字符串(格式:数组名[键]) ref_str="$1[$2]" # 利用!符号完成间接引用取值 echo "${!ref_str}"
同样执行sh.sh second elem会输出fooo。
注意事项
- 必须保证传入的第一个参数是已声明的关联数组名称,否则会报错或输出空值;
- 可选的参数检查逻辑可以提升脚本的健壮性,避免非法输入导致的异常;
- 名称引用(
declare -n)是Bash 4.3及以上版本才支持的特性,若需要兼容更老的Bash版本,优先选择间接引用方法。
内容的提问来源于stack exchange,提问作者AmooAti
相关产品推荐
相关产品推荐

