[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Feature request: Empty associative-array keys

From: Koichi Murase
Subject: Feature request: Empty associative-array keys
Date: Fri, 9 Apr 2021 07:02:00 +0900

This is a topic I originally mentioned in another discussion on the
new treatment of assoc_expand_once (
https://lists.gnu.org/archive/html/bug-bash/2021-03/msg00059.html ).
As in the mail subject, I suggest supporting empty keys for
associative arrays.  Does anyone have any opinion on this suggestion?


Currently, associative arrays do not accept empty keys.  We can work
it around e.g. by always prefixing `x' before the keys, such as
`assoc[x$key]=$value'.  But I still think we may support empty keys
for associative arrays because I don't see strong reasons to disallow
the empty keys of associative arrays.  Here is the quote of the
original discussion:

2021年3月16日(火) 10:41 Koichi Murase <myoga.murase@gmail.com>:
> Maybe this is unrelated to the extra expansions of array subscripts,
> but is there any reason that Bash disallows empty associative keys?
> This is also a point that confuses users related to the keys of
> associative arrays. Associative arrays in other languages usually
> accept an empty key. I usually use `a[x$key]' for the workaround, but
> I personally feel we should support empty associative keys in Bash. I
> also remember that at least two other people were confused by the
> current behavior not accepting the empty key.


Here I summarize the current behavior for the empty keys.  It seems
Bash already parses empty keys for assignments, but they seem to be
afterward rejected:
  $ declare -A a=()
  $ a[]=1
  bash-dev: a[]: bad array subscript
  $ a['']=1
  bash-dev: a['']: bad array subscript

`a[]' in parameter expansions are not parsed.  The variant `a['']'
pass through the parsing phase but is later rejected:
  $ echo ${a[]}
  bash-dev: ${a[]}: bad substitution
  $ echo ${a['']}
  bash-dev: a: bad array subscript

The variable name `a[]' is rejected in `printf -v', indirect
expansions, and namerefs:
  $ printf -v 'a[]' 1
  bash-dev: printf: `a[]': not a valid identifier
  $ printf -v 'a[""]' 1
  bash-dev: a[""]: bad array subscript
  $ iref='a[]'; echo ${!iref}
  bash-dev: a[]: invalid variable name
  $ iref='a[""]'; echo ${!iref}
  bash-dev: a: bad array subscript
  $ declare -n nref='a[]'; echo $nref
  bash-dev: declare: `a[]': invalid variable name for name reference
  $ declare -n nref='a[""]'; echo $nref
  bash-dev: a: bad array subscript

No error message for `unset 'a[]''?
  $ unset 'a[]'
  $ unset 'a[""]'
  bash-dev: unset: [""]: bad array subscript


reply via email to

[Prev in Thread] Current Thread [Next in Thread]