Win10下Ubuntu终端BASH关联数组按索引取值结果异常
问题成因与解决方案
成因
这个现象的根本原因是declare -A声明关联数组的命令没有生效,后续的赋值操作全部作用于普通索引数组:
- 普通索引数组的下标只能是整数,如果你传入字符串作为下标,Bash会将该字符串作为算术表达式求值。你使用的
BMW、TOYOTA等字符串未被定义为变量,算术求值结果全部为0,所有赋值实际上都是修改car[0]的值,最后一次赋值为car[Mercedes]=Benz,所以不管你访问哪个下标,返回的都是最后写入的Benz。
导致declare -A失效的常见场景有两种:
- 你没有在Bash环境下运行代码:
Ubuntu默认的sh指向dash,dash不支持declare -A语法,直接用sh 脚本名运行脚本、或者当前终端会话的shell是dash/zsh等不兼容Bash关联数组语法的shell时,declare -A会直接执行失败,你忽略该报错就会看到异常输出。 - 你当前的Bash会话中,已经提前将
car声明为普通索引数组:
普通数组无法直接转为关联数组,重复声明时declare -A会抛出报错且不生效,同样会触发后续赋值全部写到索引0的问题。
解决方法
按顺序执行以下操作即可修复问题:
- 确认运行环境为Bash:
- 终端直接操作的话,执行
bash切换到Bash会话,再执行后续代码 - 写脚本运行的话,必须在脚本第一行添加
#!/bin/bash的shebang声明,给脚本加执行权限后用./脚本名的方式运行,不要用sh 脚本名调用
- 终端直接操作的话,执行
- 执行
unset car清空已有的同名变量声明,避免冲突 - 重新运行你的关联数组代码即可,正确可运行的示例如下:
unset car declare -A car car[BMW]=i8 car[TOYOTA]=Corolla car[Honda]=Civic car[Mercedes]=Benz echo "${car[TOYOTA]}"
执行后会正常输出Corolla。
内容的提问来源于stack exchange,提问作者Data Engineer
相关产品推荐
相关产品推荐

