bash 4.0+ 中关联数组用 declare -a 声明,遍历键值需用 "${!arr[@]}" 获取键列表、"${arr[$key]}" 获取对应值,推荐配合 for 循环;输出顺序不保证插入顺序,可用 sort 稳定;须检查数组存在且非空再遍历,且仅兼容 bash 非 posix shell。

在 Bash 4.0+ 中,关联数组(associative array)支持用 declare -A 声明,遍历其键和值有明确语法,关键在于使用 !array[@] 获取键列表、array[@] 获取值列表,并配合 for 循环。
获取所有键并遍历
用 ${!arr[@]}(注意开头的 !)展开为所有键名,再逐个访问对应值:
declare -A fruits
fruits=(["apple"]=5 ["banana"]=3 ["cherry"]=8)
for key in "${!fruits[@]}"; do
echo "键: $key, 值: ${fruits[$key]}"
done
输出顺序不保证是插入顺序(Bash 4.3+ 默认按哈希顺序,非随机但不可控),如需稳定顺序可配合 sort:
for key in $(printf '%s\n' "${!fruits[@]}" | sort); do
echo "键: $key, 值: ${fruits[$key]}"
done
同时获取键与值(推荐方式)
直接用 for key in "${!arr[@]}" 是最常用且安全的方式,避免了键含空格或特殊字符时出错。不要尝试用 for kv in "${arr[@]}",因为这只能拿到值,丢失键信息。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
检查数组是否为空或是否存在
遍历时建议先判断数组是否已声明且非空,防止报错:
- 用
declare -p arr &>/dev/null检查变量是否为关联数组 - 用
[ ${#arr[@]} -eq 0 ]判断元素个数是否为 0 - 完整示例:
if declare -p fruits &>/dev/null && [ ${#fruits[@]} -gt 0 ]; then
for key in "${!fruits[@]}"; do
printf "%s → %s\n" "$key" "${fruits[$key]}"
done
else
echo "fruits 未定义或为空"
fi
注意事项
关联数组是 Bash 特性,不兼容 POSIX shell(如 dash、sh)。确认环境 Bash 版本 ≥ 4.0:
echo $BASH_VERSION
若在脚本开头未指定解释器,务必写 #!/bin/bash,而非 #!/bin/sh。










