如何从Bash字典中的数组获取指定索引元素?
问题分析与解决办法
你犯了两个关键错误:
- 未将
dict声明为关联数组(即你说的字典),Bash普通数组仅支持整数索引,["memes"]会被强制转为整数0,导致赋值到了索引0的位置。 - Bash不支持直接把数组作为关联数组的元素值,
$list等价于${list[0]},只会取数组的第一个元素存进去。
下面是两种可行的正确做法:
方法一:使用命名引用(Bash 4.3+ 支持)
用命名引用可以直接关联原数组,操作最直观:
# 声明普通数组 declare -a list=("kek" "lol") # 声明关联数组 declare -A dict # 将数组名存入关联数组 dict["memes"]="list" # 创建命名引用,指向关联数组中存储的数组名 declare -n arr_ref=${dict["memes"]} # 通过引用直接操作原数组 echo ${arr_ref[1]} # 输出 lol
方法二:数组序列化存储
如果你的Bash版本不支持命名引用,可以把数组拼接成字符串存入关联数组,取出时再拆分回数组:
list=("kek" "lol") declare -A dict # 用换行符拼接数组(换行符一般不会出现在普通元素里,避免拆分错误) dict["memes"]=$(IFS=$'\n'; echo "${list[*]}") # 取出字符串并拆分回数组 IFS=$'\n' read -r -d '' -a retrieved_list <<< "${dict["memes"]}" echo ${retrieved_list[1]} # 输出 lol
原代码问题解析
- 没加
declare -A dict时,dict是普通索引数组,["memes"]作为索引会被转成0,所以dict[0]被赋值为$list(即"kek"),这就是echo ${dict[0]}能输出kek的原因,而dict[1]从未被赋值,所以输出为空。 - 哪怕声明了关联数组,
["memes"]=$list也只会把数组的第一个元素存进去,因为Bash中直接使用数组名不加索引的话,默认取索引0的元素。
内容的提问来源于stack exchange,提问作者BaronRandom
相关产品推荐
相关产品推荐

