On Thu, Nov 7, 2024, 21:10 Chet Ramey <chet.ra...@case.edu> wrote: > On 11/6/24 9:38 PM, David Linden wrote: > > > Bash Version: 4.4 > > Patch Level: 20 > > Release Status: release > > > > Description: > > This errors in 4.4, did not in 4.2: set -u; declare -A foo; echo > ${#foo[@]} > > Yes, this was a bug in bash-4.2, fixed in bash-4.3. A variable isn't set > until it's been assigned a value. This fix aligns the array variable > behavior with the scalar (non-array) variable behavior. > > > > How am I supposed to determine that a declared associative array > is empty? >
to try to answer ' how to check if assoc arr is empty ' first [[ ${name@a} == *A* ]] or == A not sure then in code ~/m $ cat m.test.emptyassoc #!/bin/bash c() { local r=$@ eval -- "$r" l } l() { l1 } r() { eval "$@" && echo -e "$@\t\t$r" } l1() { r [[ -v $n ]] r "(( \${#$n[@]} ))" } unset -v assoc n n=assoc c : init c declare -A assoc c 'assoc+=( foo bar )' c 'assoc+=( 2foo 2bar )' c unset -v $n ~/m $ bash m.test.emptyassoc [[ -v assoc ]] assoc+=( foo bar ) (( ${#assoc[@]} )) assoc+=( foo bar ) [[ -v assoc ]] assoc+=( 2foo 2bar ) (( ${#assoc[@]} )) assoc+=( 2foo 2bar ) therefore [[ -v and (( $# works That's not the question that `set -u' answers. It will tell you whether > a variable with attributes (or without) has been assigned a value. > > Does your code manage this variable? If it does, you should be able to > determine whether or not it was ever assigned a value, or make sure > that it has been assigned a value, if that's important. The empty array > is a valid value, just like the empty string is a valid value for scalar > variables. > > > Or even use it in a conditional even one where the value won't be > evaluated? > what What do you mean? Using something like foo[@] is fine in expansions > where it won't be expanded: > > echo ${foo[@]-unset} > > or > > v=set; echo ${v:-foo[@]} > > But if you get into a case where the variable needs to be expanded, > you're going to get an error if the variable isn't set. > > -- > ``The lyf so short, the craft so long to lerne.'' - Chaucer > ``Ars longa, vita brevis'' - Hippocrates > Chet Ramey, UTech, CWRU c...@case.edu http://tiswww.cwru.edu/~chet/ >