[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: associative arrays and [[ -v
From: |
isabella parakiss |
Subject: |
Re: associative arrays and [[ -v |
Date: |
Sat, 18 Apr 2015 00:45:30 +0200 |
On 4/17/15, Chet Ramey <chet.ramey@case.edu> wrote:
> On 4/17/15 5:12 AM, isabella parakiss wrote:
>> I need to check if an element in an associative array is set. What's the
>> correct way to test it?
>
> If *any* element is set, or if a particular element is set?
>
>>
>>
>> $ declare -A arr=([x]=y); var=*
>> $ [[ -v arr["$var"] ]]; echo $?
>> 0
>> $ [[ ${arr["$var"]} ]]; echo $?
>> 1
>>
>>
>> The former seems wrong, the glob is expanded even if "$var" is quoted.
>
> It's not a glob. The array subscripts `@' and `*' are special and expand
> to all elements of an array.
>
>> The latter works but it doesn't distinguish between unset and empty.
>
> The distinction is murky. A variable is not set unless it has been
> assigned a value. Has an array variable that has no elements been
> assigned a value? Is the concept of a=() meaningful and useful?
>
>> Is there a way to test it with ''[[ -v'' ?
>
> Are you interested in whether or not an array has been declared or whether
> it has any elements?
>
>> Also this one seems wrong, found by geirha:
>>
>> $ declare -A a=([x]=y); [[ -v a ]]; echo $?
>> 1
>> $ declare -A a=(["0"]=y); [[ -v a ]]; echo $?
>> 0
>
> Referencing an array without a subscript is equivalent to referencing
> element 0.
>
> Chet
> --
> ``The lyf so short, the craft so long to lerne.'' - Chaucer
> ``Ars longa, vita brevis'' - Hippocrates
> Chet Ramey, ITS, CWRU chet@case.edu http://cnswww.cns.cwru.edu/~chet/
>
I'm interested to test if the element '*' is set.
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?
---
xoxo iza