bash 4.0+才支持关联数组,必须用declare -a显式声明,遍历需用"${!array[@]}"取key、"${array[$key]}"取值,未声明或误用索引数组语法将导致静默错误。

Linux Shell 脚本中定义关联数组需要 Bash 4.0+
关联数组(即字典)在 Bash 中叫 associative array,不是所有 shell 都支持——sh、dash、zsh(默认不启用)都不行,必须用 bash 且版本 ≥ 4.0。运行 bash --version 确认;如果系统默认 /bin/sh 是 dash(如 Ubuntu),直接写 #!/bin/sh 会静默失败,必须显式写 #!/bin/bash。
定义前必须先声明,否则赋值会被当普通索引数组处理:
declare -A user_info user_info["name"]="Alice" user_info["age"]=28 user_info["city"]="Shanghai"
遍历关联数组的 key 和 value 要用 !array[@] 和 ${array[@]}
不能用 ${#array[@]} 取长度来循环下标(那是索引数组的玩法),关联数组没有顺序下标。正确方式是先取 key 列表,再逐个访问 value:
for key in "${!user_info[@]}"; do
echo "$key: ${user_info[$key]}"
done
-
"${!user_info[@]}"返回所有 key(加双引号防空格截断) -
${user_info[$key]}根据 key 取对应 value - key 本身可能是含空格或特殊字符的字符串,所以
$key必须放在双引号内参与索引:即${user_info["$key"]}更稳妥(尤其当 key 来自变量或命令替换时)
常见错误:用 for v in ${array[@]} 丢 key 信息
这种写法只拿到 value,完全丢失 key,且若 value 含空格会被拆成多个词:
# ❌ 错误示范:无法知道哪个 value 对应哪个 key
for v in ${user_info[@]}; do
echo "$v" # 输出乱序,且无上下文
done
更糟的是,如果某个 value 是 "New York",上面循环会输出 New 和 York 两行。真正需要 key-value 对时,必须用 "${!array[@]}" 配合索引访问。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
另外注意:for key in ${!array[@]}(没加引号)在 key 含空格时也会崩,务必写成 "${!array[@]}"。
实际脚本中建议加 set -u 并检查 key 是否存在
访问不存在的 key 默认返回空字符串,容易掩盖逻辑错误。开启 set -u 后,未定义变量会报错,但对数组 key 不生效;更可靠的是用 ${array[key]+_} 检查:
if [[ -n ${user_info["email"+_} ]]; then
echo "Email exists: ${user_info[email]}"
else
echo "Email not set"
fi
或者更清晰的写法:
if [[ ${user_info["email"]+isset} == "isset" ]]; then
echo "Email is ${user_info[email]}"
fi
这种检测在读配置、解析参数等场景很关键——比如你期望有 "timeout" key,但拼错了写成 "timeou",不检查就直接用,后续逻辑可能静默出错。
关联数组本身不序列化,不跨进程共享,也不支持嵌套;真要存复杂结构,该换 Python 或 jq 处理 JSON。










