On 4/20/15, Chet Ramey <chet.ra...@case.edu> wrote: > On 4/17/15 6:45 PM, isabella parakiss wrote: > >> This seems the way to go, but I'm not sure I understand why: >> >> $ declare -A arr=([a]=b) >> $ [[ -v arr['$var'] ]]; echo $? >> 1 >> $ declare -A arr=(['*']=x) >> $ [[ -v arr['$var'] ]]; echo $? >> 0 >> >> >> What's happening? > > Well, as I said before, `*' is special: it expands to all elements of the > array, in the same way as $*. So you have to protect it through all > word expansions. > > First, each word in the conditional expression is expanded as described in > the manual page > > "tilde expansion, parameter and > variable expansion, arithmetic expansion, command substitution, > process substitution, and quote removal are performed." > > That leaves the word as 'arr[$var]' (without the quotes, of course). The > subscript in an associative array reference also undergoes expansions, the > same ones as the rhs of an assignment statement (pretty much the same as > above). That expands the $var, leaving arr[*]. Since the check for `*' or > `@' as a subscript happens before expansion, the shell looks for the `*' > as an element of the array. > > In the first case, it doesn't find it; in the second, it does. > > 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/ >
Thanks a lot for the explanation, that was tricky. --- xoxo iza