必须用 declare -A 声明关联数组,并用 ${!array[@]} 获取键;for key in "${!fruits[@]}"; do echo "键: $key → 值: ${fruits[$key]}"; done。

在 Linux 的 Bash 中,遍历关联数组(associative array)的所有键,需要用 !array[@] 语法配合 ${!array[@]} 展开,再通过 for 循环处理。
确认数组是关联类型且已声明
关联数组必须显式用 declare -A 声明,否则会被当作普通索引数组,导致键遍历失败:
declare -A fruits fruits=(["apple"]=red ["banana"]=yellow ["grape"]="purple green")
用 ${!array[@]} 获取所有键
${!array[@]} 是专门用于获取关联数组所有键的语法(注意开头的感叹号),它返回的是一个空格分隔的键列表:
for key in "${!fruits[@]}"; do
echo "键: $key → 值: ${fruits[$key]}"
done
- 双引号包裹
"${!fruits[@]}"可防止键名含空格时被错误分割(虽然关联数组键本身不能含空白符,但加引号是安全习惯) - 键顺序不保证——Bash 关联数组的键无序,如需排序,可管道给
sort:for key in $(printf '%s\n' "${!fruits[@]}" | sort); do ...
避免常见错误写法
以下写法都不适用于关联数组的键遍历:
-
${fruits[@]}→ 返回所有值,不是键 -
${!fruits[*]}或${!fruits[0]}→ 语法错误或只取第一个键的引用(非预期行为) -
for key in ${fruits[@]}; do→ 遍历的是值,且未加引号易出错
扩展:同时获取键和值(一行内)
如果想在循环中同时访问键与值,无需额外查表,直接用 $key 索引即可:
for key in "${!fruits[@]}"; do
value="${fruits[$key]}"
printf "Key='%s', Value='%s'\n" "$key" "$value"
done
不复杂但容易忽略关键细节:必须用 declare -A + ${!array[@]} 这一对组合,缺一不可。


















