On Saturday, August 18, 2012 07:55:17 PM Stephane Chazelas wrote: > 2012-08-18 10:26:22 -0500, Dan Douglas: > > This is a feature that all shells with this style of compound assignment > > have > > in common. If no explicit subscripts are given, the text between the > > parentheses is processed exactly as though it were arguments to a command > > including brace expansion, word-splitting, and pathname expansion (and > > consequently, quoting is just as important). This is an important feature > > because it allows storing the results of a glob in an array easily. > > > > If a subscript is given explicitly, then the right-hand side of the > > assignment > > is treated exactly as an ordinary scalar assignment would be, including all > > analagous behaviors for `+=' and the integer attribute. > > > > $ set -x; a=( [1]=* ) > > + a=([1]=*) > [...] > > Nope: > > ~/1$ touch '[1]=x' > ~/1$ bash -c 'a=( [1]=* ); echo "${a[@]}"' > [1]=x > ~/1$ bash -c 'a=( [1]=asd ); echo "${a[@]}"' > asd > > That's a bug though. > > Just do > > a=("*") or a=('*') or a=(\*) > > Eh yeah. At least the left side gets implicit quoting, and it correctly disables brace expansion. In mksh compound assignment is just sugar for set -A, so Bash isn't unique in this.
$ touch 1=a; mksh -c 'a=([123]=*); print -r "${a[@]}"' 1=a -- Dan Douglas