declare -a 用于定义 bash 4.0+ 的关联数组,支持声明、初始化、读取、遍历、键存在性检查及删除;需注意版本兼容性、键名引号规则、避免与索引数组混用及子 shell 作用域限制。

在 Linux 的 Bash 脚本中,declare -A 用于定义关联数组(即键值对数组),它从 Bash 4.0 开始支持。使用前需确认 Bash 版本(运行 bash --version),低于 4.0 将报错“declare: -A: invalid option”。
定义和初始化关联数组
用 declare -A 声明变量为关联数组,之后可逐个赋值或一次性初始化:
- 单独声明:
declare -A user_info - 声明并赋值:
declare -A user_info=(["name"]="Alice" ["age"]=28 ["city"]="Shanghai") - 后续添加/修改:
user_info["email"]="alice@example.com"或user_info[email]="alice@example.com"(键名不加引号也可,但含空格或特殊字符时必须加双引号)
读取和遍历关联数组
获取单个值用 ${array[key]};遍历所有键或值需借助特殊语法:
- 取某个值:
echo "${user_info[name]}"→ 输出Alice - 获取全部键:
echo "${!user_info[@]}"(注意!符号) - 获取全部值:
echo "${user_info[@]}" - 安全遍历(推荐):
for key in "${!user_info[@]}"; do<br> echo "$key → ${user_info[$key]}"<br> done
检查键是否存在及删除操作
关联数组不支持直接判断“键是否存在”的内置语法,但可通过间接方式实现:
- 检查键是否存在(利用参数扩展):
if [[ -n "${user_info[key]+isset}" ]]; then echo "key exists"; fi
或更常用:if [[ "${user_info[key]+yes}" == "yes" ]]; then ... fi - 删除某个键值对:
unset user_info[name] - 清空整个数组:
unset user_info或重新声明declare -A user_info
常见注意事项
实际写脚本时容易踩坑,注意以下几点:
- 脚本开头建议显式指定解释器:
#!/bin/bash,避免系统默认调用 dash 或旧版 bash - 键名中若含空格、破折号或点号,必须用双引号包裹,如
user_info["full-name"]="Alice Smith" - 不能用
user_info[0]="value"这类数字下标当作普通数组混用,否则行为不可预测 - 子 shell 中修改的关联数组不会影响父 shell(如管道中的 for 循环),需用进程替换或重定向规避











