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/