4.4 change in behavior from 4.3: how to catch unset when using ${#length}
On 4.3 and earlier, at least on arrays, one could have the illusion of this working w/o complaint -- and returning 0 when the array was 0-len or unset, or the array length, otherwise: echo ${#array[@]:-0} But I note it only seemed to work in arrays, and in 4.4 gets a syntax error: echo ${#array[@]:-0} bash: ${#array[@]:-0}: bad substitution Is there any reason why such a syntax wouldn't be workable -- including adding: echo ${#wordlen:-0} to allow catching an undefined word? or is there some other, inline way to do this? -linda
Re: 4.4 change in behavior from 4.3: how to catch unset when using ${#length}
Eduardo Bustamante wrote: what's wrong with?: echo ${#array[@]} It will return: - With array=(1 2 3) -> 3 - With array=() -> 0 - With unset array -> 0 - With declare -a array -> 0 Seems to do what you're looking for. Not when "-u" is set, which I often have on to help catch misspellings. set -u echo ${#array[@]} bash: array: unbound variable Compare to: if [[ ${yesno:-""} == yes ]]; then ... fi # basically wanting 1 test for members, else return 0 if [[ ${array[@]:-"undef"} != undef ]] && ((${#array[@]})) tnx, -l
Re: 4.4 change in behavior from 4.3: how to catch unset when using ${#length}
what's wrong with?: echo ${#array[@]} It will return: - With array=(1 2 3) -> 3 - With array=() -> 0 - With unset array -> 0 - With declare -a array -> 0 Seems to do what you're looking for.