トリッキー。
$ 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)
$ 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")'
が完了:
$ 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")'
['unset arr [" $ key "]'](http://mywiki.wooledge.org/BashGuide/Practices#Quoting)? **編集**:これはどちらも動作しません... – anishsane
bashのバグのように見えます – Leon
うーん...私の悪い...また、 'arr ['$ x'] = 123; unset arr ['$ x'] '' -bash:unset:[$ x]:不正な配列の添え字 ' – anishsane