there is still code fault $n is supposed to be 'assoc' im sorry bye On Thu, Nov 7, 2024, 23:44 #!microsuxx <fxmb...@gmail.com> wrote:
> sorry code cleaned up : it was more and stuff > > c() { > eval -- "$@" > l > } > > l() { > r [[ -v $n ]] > r "(( \${#$n[@]} ))" > } > > r() { > eval "$@" && > echo -e "$@\t\t$r" > } > > c unset -v assoc > c declare -A assoc > c 'assoc+=( foo bar )' > c 'assoc+=( 2foo 2bar )' > c unset -v assoc > > On Thu, Nov 7, 2024, 23:36 #!microsuxx <fxmb...@gmail.com> wrote: > >> >> >> 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/ >>> >>