Re: -v no longer works for associative arrays

2022-10-13 Thread Greg Wooledge
On Thu, Oct 13, 2022 at 02:35:55PM -0400, Chet Ramey wrote:
> On 10/13/22 12:47 PM, Bryan Roessler wrote:
> > For indexed arrays, yes. I hadn't made the connection with associative
> > arrays since I don't typically index them with numbers, thanks.
> 
> There has to be some default, and "0" is at least consistent with indexed
> arrays.

I actually would have preferred an error message.  Something like
"bash: test: missing array index" would have been clear enough for me.

The current behavior is absolutely mystifying for most people.

I'm not actually requesting a change.  I recognize that it's far too
late for that.  Hmm...

If at some point you choose to add a shopt that turns on extra warnings,
I'd love it if *this* could be included in said warnings.  The use of an
array variable with no index, having index "0" be chosen for you, is
worthy of a warning, in such a hypothetical mode.



Re: -v no longer works for associative arrays

2022-10-13 Thread Chet Ramey

On 10/13/22 12:47 PM, Bryan Roessler wrote:
For indexed arrays, yes. I hadn't made the connection with associative 
arrays since I don't typically index them with numbers, thanks.


There has to be some default, and "0" is at least consistent with indexed
arrays.

--
``The lyf so short, the craft so long to lerne.'' - Chaucer
 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRUc...@case.eduhttp://tiswww.cwru.edu/~chet/




Re: -v no longer works for associative arrays

2022-10-13 Thread Bryan Roessler
For indexed arrays, yes. I hadn't made the connection with associative
arrays since I don't typically index them with numbers, thanks.

$ declare -A f[0]=true
$ declare -A g[foo]=bar
$ test -v f; echo $?
0
$ test -v g; echo $?
1

On Thu, Oct 13, 2022 at 12:10 PM Chet Ramey  wrote:

> On 10/13/22 12:06 PM, Oğuz wrote:
>
> >   test -v seems broken anyway
> >
> > $ declare -A foo=(a 42)
> > $ declare -a bar=(42)
> > $ test -v foo; echo $?
> > 1
> > $ test -v bar; echo $?
> > 0
>
> You know that referencing an array variable without a subscript is
> equivalent to referencing element 0 (or "0").
>
> --
> ``The lyf so short, the craft so long to lerne.'' - Chaucer
>  ``Ars longa, vita brevis'' - Hippocrates
> Chet Ramey, UTech, CWRUc...@case.eduhttp://tiswww.cwru.edu/~chet/
>
>


Re: -v no longer works for associative arrays

2022-10-13 Thread Oğuz
13 Ekim 2022 Perşembe tarihinde Chet Ramey  yazdı:
>
> You know that referencing an array variable without a subscript is
> equivalent to referencing element 0 (or "0").
>

Yes, but I didn't know that it applied to test -v as well.

Thanks for the reply


-- 
Oğuz


Re: -v no longer works for associative arrays

2022-10-13 Thread Chet Ramey

On 10/13/22 12:06 PM, Oğuz wrote:


  test -v seems broken anyway

$ declare -A foo=(a 42)
$ declare -a bar=(42)
$ test -v foo; echo $?
1
$ test -v bar; echo $?
0


You know that referencing an array variable without a subscript is
equivalent to referencing element 0 (or "0").

--
``The lyf so short, the craft so long to lerne.'' - Chaucer
 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRUc...@case.eduhttp://tiswww.cwru.edu/~chet/




Re: -v no longer works for associative arrays

2022-10-13 Thread Oğuz
13 Ekim 2022 Perşembe tarihinde Chet Ramey  yazdı:

> There are other ways to test whether or not an associative array has any
> set elements, but there was no way to use `*' or `@' as a key in previous
> versions.
>

 test -v seems broken anyway

$ declare -A foo=(a 42)
$ declare -a bar=(42)
$ test -v foo; echo $?
1
$ test -v bar; echo $?
0


-- 
Oğuz


Re: -v no longer works for associative arrays

2022-10-13 Thread Greg Wooledge
On Thu, Oct 13, 2022 at 10:42:02AM -0400, Bryan Roessler wrote:
> Description:
> 
> bash-5.2# declare -A a
> bash-5.2# a[foo]=bar
> bash-5.2# [[ -v a[@] ]]; echo $?
> 1
> 
> bash-5.1# declare -A a
> bash-5.1# a[foo]=bar
> bash-5.1# [[ -v a[@] ]]; echo $?
> 0
> 
> If this is by design I missed it.

unicorn:~$ bash-5.2
unicorn:~$ declare -A a=([@]=at [foo]=bar)
unicorn:~$ [[ -v a[@] ]]; echo $?
0

What are you even trying to do there?  Determine whether the associative
array has 1 or more elements?  You can use ${#a[@]} for that, just like
with indexed arrays.

unicorn:~$ echo "${#a[@]}"
2



Re: -v no longer works for associative arrays

2022-10-13 Thread Chet Ramey

On 10/13/22 10:42 AM, Bryan Roessler wrote:


Bash Version: 5.2
Patch Level: 2
Release Status: release

Description:

bash-5.2# declare -A a
bash-5.2# a[foo]=bar
bash-5.2# [[ -v a[@] ]]; echo $?
1


From CHANGES:

j. Associative array assignment and certain instances of referencing (e.g.,
   `test -v') now allow `@' and `*' to be used as keys.

There are other ways to test whether or not an associative array has any
set elements, but there was no way to use `*' or `@' as a key in previous
versions.

There was a long discussion about this back in early 2021. Some of the
relevant messages about `@' and `*' keys start here:

https://lists.gnu.org/archive/html/bug-bash/2021-04/msg00058.html

--
``The lyf so short, the craft so long to lerne.'' - Chaucer
 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRUc...@case.eduhttp://tiswww.cwru.edu/~chet/