On Sun, Dec 12, 2021 at 08:47:21PM +0100, l.bash...@scarydevilmonastery.net wrote: > Configuration Information [Automatically generated, do not change]: > Machine: x86_64 > OS: linux-gnu > Compiler: gcc > Compilation CFLAGS: -g -O2 -fstack-protector-strong -Wformat > -Werror=format-security -Wall > uname output: Linux h2 5.15.0-2-amd64 #1 SMP Debian 5.15.5-1 (2021-11-26) > x86_64 GNU/Linux > Machine Type: x86_64-pc-linux-gnu > > Bash Version: 5.1 > Patch Level: 12 > Release Status: release > > Description: > making left square bracket char ([) part of the key into a hash causes > unset to silently fail when trying to unset that specific hash item. > The position of left square bracket char in the string used as key > doesn't > matter. unset also fails when the key is a single [ character. > Please refer to the following script which attempts to demonstrate this > quirk. > > Repeat-By: > > # diagnostic shows remains of hash after attempts to unset single item. > show() { echo "$1, ${#a[@]} items in a: a['${!a[@]}']=${a['[foo]']}"; } > > > # prepare test scenario > > declare -A a # make "a" a hash > a['[foo]']="bar" # assign "bar" to item keyed [foo] > show "good" # correctly output item, show correct > item count > > > # intention is to get rid of the item again, by unsetting the single item, > not the whole array. > # several ways of quoting are attempted here > > unset "a['[foo]']" # try to remove item > show "wrong" # can still output item, item still > counts > > unset 'a["[foo]"]' # try to remove item > show "wrong" # can still output item, item still > counts > > unset 'a[[foo]]' # try to remove item > show "wrong" # can still output item, item still > counts > > unset "a[[foo]]" # try to remove item > show "wrong" # can still output item, item still > counts > > unset "a[\[foo]]" # try to remove item > show "wrong" # can still output item, item still > counts > > unset "a["\[foo]"]" # try to remove item > show "wrong" # can still output item, item still > counts > > unset "a['['foo]]" # try to remove item > show "wrong" # can still output item, item still > counts > > a["[foo]"]="" # Best I can currently do > show "set empty, item still counted" # item still there though contents are > empty string.
Just to say this unsets the element correctly: k='[foo]' unset -v 'a["$k"]' -- Andreas (Kusalananda) Kähäri SciLifeLab, NBIS, ICM Uppsala University, Sweden .