This behavior is quite surprising: $ declare -A blah $ blah['$(DOESNOTEXIST)']=broken $ for i in "${!blah[@]}"; do echo "$i"; done $(DOESNOTEXIST) $ for i in "${!blah[@]}"; do unset blah["$i"]; done bash: DOESNOTEXIST: command not found bash: unset: [$(DOESNOTEXIST)]: bad array subscript
I wouldn't have anticipated the double expansion of "$i" there. Is this a bug? Bash 5.1p4.