在Bash中,我想取消設置hashmap的條目。但我失敗了。代碼如下:使用引號作爲鍵的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
如何取消設置此條目?
在Bash中,我想取消設置hashmap的條目。但我失敗了。代碼如下:使用引號作爲鍵的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
如何取消設置此條目?
只需使用單引號:
$ 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")'
完成!
輝煌的樣子! – ruanhao
這是神奇的。是否記錄了'unset'進行第二輪擴展? –
@glennjackman:我還沒有看到它的記錄,真的,但它不是特定於'unset'。算術上下文也顯示了這種行爲:'declare -A glenn; key ='$(ls> &2)';((glenn [$ key]))'。驚喜。答案可能在源代碼':)'中。 Bash有一種非常瘋狂的解析方式。 –
棘手。您可以通過轉義「內部」單引號來手工完成:
$ 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")'
['unset arr [「$ key」]'](http://mywiki.wooledge.org/BashGuide/Practices#Quoting)? **編輯**:這也不起作用... – anishsane
看起來像在bash中的錯誤 – Leon
嗯......我的壞......另外,'arr ['$ x'] = 123; unset arr ['$ x']'給出'-bash:unset:[$ x]:bad array subscript' – anishsane