On Fri, Jun 13, 2025 at 08:14:51 -0600, Stan Marsh wrote:
> >According to <https://mywiki.wooledge.org/BashPitfalls#pf62>:
>
> I can't access that URL - get "Bad Gateway" (in at least two different
> browsers)
Sometimes if there are too many requests all at once, it can get a
bit cranky. Wait a few minutes and try again, is all I can suggest.
> > (( hash[$key]++ )) # is not safe
> > let 'hash[$key]++' # is safe
>
> Could you explain what the issue/problem is? What makes it unsafe?
>
> And, I really don't like the sound of "It varies by version of bash"...
I already showed this.
bash-5.2:
hobbit:~$ unset hash
hobbit:~$ declare -A hash; key=\'\]
hobbit:~$ (( hash[$key]++ ))
hobbit:~$ declare -p hash
declare -A hash=(["']"]="1" )
bash-5.1:
hobbit:~$ bash-5.1
hobbit:~$ declare -A hash; key=\'\]
hobbit:~$ (( hash[$key]++ ))
bash-5.1: ((: hash[']]++ : bad array subscript (error token is "hash[']]++ ")
hobbit:~$ let 'hash[$key]++'
hobbit:~$ declare -p hash
declare -A hash=(["']"]="1" )
The issue is that there are values of $key for which (( hash[$key]++ ))
breaks, in various ways, in various versions of bash. There are some
workarounds for this, but the workaround that we *used* to promote
as the best one available stopped working in bash 5.2.
So now we're promoting let 'hash[$key]++' as the best workaround, unless
that one also breaks in some future version. If that happens, then
we'll be reduced to tmp=${hash[$key]}; let tmp++; hash[$key]=$tmp
which seems to be the only workaround that will probably never break.