Bash关联数组加载带引号键的文件失败问题求助
Bash关联数组读入带引号键的问题解决
问题本质
你遇到的核心差异在于:
- 手动赋值时写的
dict["g"]="g",这里的引号是Bash的语法符号,用来界定字符串边界,实际存入数组的键是g,引号不会被当作键的一部分。 - 从文件里
read到的"a"是完整的字符串内容,引号会被当作键的一部分存入数组,也就是说数组里的键是"a"(带引号),而不是a。这时候你用${dict[a]}去访问,自然找不到对应的值。
两种解决方案
方案1:读取时移除引号(推荐)
如果你的目标是把a、b作为键,而非带引号的"a"、"b",可以在读取后用参数扩展去掉引号,或者预处理输入文件:
方法A:用参数扩展移除引号
修改循环部分:
#!/bin/bash -e declare -A dict while read key; do # 移除字符串中的所有双引号 key=${key//\"/} dict[$key]=$key done < test2.txt echo "This works ${dict[a]} ${dict[b]}"
方法B:用sed预处理输入
直接在读取文件时通过sed去掉引号:
#!/bin/bash -e declare -A dict while read key; do dict[$key]=$key done < <(sed 's/"//g' test2.txt) echo "This works ${dict[a]} ${dict[b]}"
方案2:保留引号作为键的一部分
如果你确实需要把带引号的字符串作为键,访问时必须匹配带引号的键,比如:
#!/bin/bash -e declare -A dict while read key; do dict[$key]=$key done < test2.txt # 用单引号包裹带引号的键,避免shell解析 echo "This works ${dict['"a"']} ${dict['"b"']}"
或者用转义的方式:${dict["\"a\""]},效果是一样的。
内容的提问来源于stack exchange,提问作者PerseP
相关产品推荐
相关产品推荐

