使用引用作为键的Bash hashmap

时间:2016-06-14 15:19:20

标签: linux bash dictionary

在Bash中,我想取消设置hashmap的条目。但我失败了。代码如下:

declare -A arr
arr["a'b"]=3
echo ${!arr[@]} ## output: a'b
key="a'b"
unset arr[$key] ## error: -bash: unset: `arr[a'b]': not a valid identifier

如何取消此条目?

2 个答案:

答案 0 :(得分:5)

只需使用单引号:

$ declare -A arr=(["a'b"]=3 [foo]=bar)
$ declare -p arr
declare -A arr='(["a'\''b"]="3" [foo]="bar" )'
$ key="a'b"
$ unset 'arr[$key]'
$ declare -p arr
declare -A arr='([foo]="bar" )'

完成!

答案 1 :(得分:4)

棘手。你可以通过逃避"内部"手工完成。单引号:

$ declare -A arr=(["a'b"]=3 [foo]=bar)
$ key="a'b"
$ unset "arr[$key]"
bash: unset: `arr[a'b]': not a valid identifier
$ unset "arr[a\'b]"
$ declare -p arr
declare -A arr='([foo]="bar" )'

但是怎么做"以编程方式"?幸运的是,bash确实有一种机制来逃避"一个字符串:printf "%q"

$ declare -A arr=(["a'b"]=3 [foo]=bar)
$ echo "$key"
a'b
$ printf "%q" "$key"
a\'b
$ unset "arr[$(printf "%q" "$key")]"
$ declare -p arr
declare -A arr='([foo]="bar" )'