Bash hashmap using quote as key

In Bash, I want to disable hash map recording. But I failed. The code is as follows:

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 

How can I cancel this entry?

+6
dictionary linux bash
source share
2 answers

Just use single quotes:

 $ 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" )' 

Done!

+5
source share

Tricky You can do this manually by avoiding the "inner" single quote:

 $ 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" )' 

But how to do it "programmatically"? Fortunately, bash has a line escape mechanism: 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" )' 
+4
source share

All Articles