bug-bash
[Top][All Lists]
Advanced

[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 <address@hidden> 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    address@hidden    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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]