On 2/16/15 12:23 PM, emanuelczi...@cryptolab.net wrote:
> Oh I see, I had no idea that's how it's meant to work. My apologies.
> 
> However this case still doesn't work, but maybe I should use single quotes
> all the time?:
> 
> this fails(double quotes):
> $ declare -A ar
> $ idbad2="["
> $ let "ar[$idbad2]+=11"
> bash: let: ar[[]+=11: bad array subscript (error token is "ar[[]+=11")
> $ declare -p ar
> bash: declare: ar: not found

Bash expects the brackets to match.  This is true when the parser tries to
find the closing bracket and when the arithmetic expression evaluator
does -- they use the same criteria.  You can make a case that they should
not have to match, but bash has always behaved this way and you'll have to
work with it, at least for now.

> this works(single quotes):
> $ let 'ar[$idbad2]+=11'
> $ declare -p ar
> declare -A ar='(["["]="11" )'

This works because the arithmetic expression evaluator doesn't have to
deal with the extra `[' when trying to find the end of the subscript, and
it's smart enough to figure out whether it's dealing with an indexed or
associative array and evaluate accordingly.

> also this variant does the same:

Because (( and let are essentially equivalent.

Chet

-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
                 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRU    c...@case.edu    http://cnswww.cns.cwru.edu/~chet/

Reply via email to