2015-08-17 10:19:00 +0200, isabella parakiss:
> Quoting is necessary in a few cases:
> 
> $ var=foo; declare -A "arr$var=([x]=y)"
> bash: warning: arrfoo=([x]=y): quoted compound array assignment deprecated
> $ var=foo; declare -A arr$var=([x]=y)
> bash: syntax error near unexpected token `('
> $ var=foo; declare -A "arr$var"=([x]=y)
> bash: syntax error near unexpected token `('
> 
> I don't think this should be the default behaiour...
[...]

This typically requires two levels of evaluation. The syntax of
"declare" is now more consistent with that of bare assignments
and there are fewer cases where "declare" ends up evaluating
code that it's not meant to.

Here, I'd do:

declare -A "arr$var"

eval "arr$var"'=([x]=y)'


By using "eval" (which has the reputation of being dangerous),
you're making it clear that there is that second level of
evaluation that one should be careful around (and which is there
as well with declare but less obvious).

The way you're expecting declare to work is just a disguised
eval, it's not any safer than eval. To me, variable declaration
should be separate from evaluating code. Ideally, I'd rather
"declare" didn't do assignments either (note that it was ksh
breaking "export" by allowing assignments and causing confusions
between simple commands and assignments that was not there in
the Bourne shell).

-- 
Stephane

Reply via email to