On 10/15/14, 4:55 AM, dnade....@orange.com wrote:
>             Hello dear bash-bug mailing-list!
> 
> I am puzzled by bash behavior with array assignments.
> 
> It seems there is a behavior change introduced in bash 4.3 in array 
> assignments. An array can actually reference itself in its own declaration.
> 
> $ declare -A foo=([bar]=1st) ; foo=([bar]=2nd [qwer]=${foo[bar]}) ; echo 
> "${foo[@]}"
> 2nd 2nd
> $ bash --version
> GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

This changed back in May, 2011 in response to this bug report:

http://lists.gnu.org/archive/html/bug-bash/2011-05/msg00005.html

The idea is that associative array assignments using the compound array
syntax should behave more like sequential assignments to the array.  That
is, foo=([bar]=2nd [qwer]=${foo[bar]}) should be like

foo[bar]=2nd ; foo[qwer]=${foo[bar]}

The change fixed a problem with double expansion and quote removal being
performed on the indices.  ksh93 does things the same way.


> 
> $ declare -a foo=(1st) ; foo=(2nd ${foo[0]}) ; echo ${foo[@]}
> 2nd 1st
> $ bash --version
> GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
> 
> $ declare -a foo=(1st) ; foo=(2nd ${foo[0]}) ; echo ${foo[@]}
> 2nd 1st
> $ bash --version
> GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)

I'll take a look at this, but bash and ksh93 do this the same way.

> Another weirdness (I think) is this:
> $ declare -A foo=([bar]=asdf [baz]=qwer) ; foo+=([bar]=asdf [baz]=qwer) ; 
> echo "${!foo[@]}" "${foo[@]}"
> bar baz asdfasdf qwerqwer

I think this behavior is useful.  If you want to overwrite values, there is
an easy way to do it, but there's value in making
foo+=([bar]=asdf [baz]=qwer) equivalent to foo[bar]+=asdf ; foo[baz]+=qwer
as above.

-- 
``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