On 5/14/19 2:53 AM, Ulrich Windl wrote: >>>> Chet Ramey <[email protected]> schrieb am 13.05.2019 um 21:44 in >>>> Nachricht > <[email protected]>: >> On 5/9/19 7:07 AM, Ulrich Windl wrote: >>> Bash Version: 4.3 >>> Patch Level: 48 >>> Release Status: release >>> >>> Hi! >>> >>> Is this intended with "set -u": >>> # set -u >>> # declare -a INSTANCES >>> # echo ${INSTANCES[*]} >>> bash: INSTANCES[*]: unbound variable >>> # INSTANCES=() >>> # echo ${INSTANCES[*]} >>> bash: INSTANCES[*]: unbound variable >>> # echo ${INSTANCES[@]} >>> bash: INSTANCES[@]: unbound variable >> >> This was changed late in the bash-4.4 development cycle (July, 2016). From >> bash-4.4/CHANGES: >> >> a. Using ${a[@]} or ${a[*]} with an array without any assigned elements >> when >> the nounset option is enabled no longer throws an unbound variable >> error. > > Thanks for the info! Actually it seems "${#a[*]}" is also affected: > v04:~> declare -a a > v04:~> echo ${#a[@]} > 0 > v04:~> set -u > v04:~> echo ${#a[@]} > bash: a: unbound variable > v04:~> a=() > v04:~> echo ${#a[@]} > 0 > v04:~> echo $BASH_VERSION > 4.3.48(1)-release
That's not an array, though, so its behavior there is expected -- and in
fact, I get the same results in bash 5.0.7(1)-release
When "a" is an unbound array declared with declare -a, its non-array
"how long am I" variable doesn't have an integer inside it, not even
"0". When "a" is a bound array declared with =(), it has a defined
length of 0. So the non-array variable "${#a[@]}"=0, and bash is happy
and continues on with life and doesn't fatally terminate in the middle
of your script in an unexpected fashion.
--
Eli Schwartz
Arch Linux Bug Wrangler and Trusted User
signature.asc
Description: OpenPGP digital signature
