[Top][All Lists]

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

Re: Associative array keys are not reusable in (( command

From: Greg Wooledge
Subject: Re: Associative array keys are not reusable in (( command
Date: Mon, 11 Jan 2021 09:31:57 -0500
User-agent: Mutt/1.10.1 (2018-07-13)

On Mon, Jan 11, 2021 at 09:07:08AM -0500, Chet Ramey wrote:
> On 1/10/21 2:55 PM, Oğuz wrote:
> > If I don't know the key beforehand, like if I read it from a file or the
> > like, this becomes a security issue. That is my concern,
> > `assoc_expand_once' doesn't help in that situation.
> If you're taking input that you haven't verified and putting it into an
> expansion context, I recommend you reconsider.
> You can also use the key-value pair assignment syntax, which doesn't
> require scanning for a close brace.

So what I'm hearing is:

It is not safe to use an associative array element inside a math
context.  This is either by design, or an unavoidable side effect of the
implementation, and it will not be fixed, and there is no sense arguing
about it.

unicorn:~$ echo "$BASH_VERSION"
unicorn:~$ declare -A aa
unicorn:~$ x='y[$(date >&2)0]'
unicorn:~$ aa[$x]=1
unicorn:~$ echo "${aa[$x]}"
unicorn:~$ echo "$(( aa[$x] ))"
Mon Jan 11 09:25:48 EST 2021

The workaround is to retrieve the AA element first, then perform the
arithmetic you need to perform using only string variables or indexed
array elements, then store the result back into the AA element if desired.

unicorn:~$ (( aa[$x]++ ))
Mon Jan 11 09:29:24 EST 2021
Mon Jan 11 09:29:24 EST 2021
unicorn:~$ tmp=${aa[$x]}; ((tmp++)); aa[$x]=$tmp
unicorn:~$ declare -p aa
declare -A aa=(["y[\$(date >&2)0]"]="2" ["y[0]"]="1" )

reply via email to

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