On 2/3/16 6:43 PM, Martijn Dekker wrote: > bash treats an empty array as if it were an unset variable, which seems > very illogical as empty is quite distinct from unset: > > $ myarray=() > $ [[ -v myarray ]] && echo set || echo unset > unset
If you use the name of an array in a variable context without using a subscript, it's equivalent to referencing element 0. Bash considers a variable set if it has been assigned a value. For an array, being set means that the number of elements is greater than zero. > $ set | grep ^myarray= # yet, it's set: > myarray=() Yes, this is arguably a bug. Bash tries to output the set of shell variables in a way that will restore them if the output is evaluated, but only puts array variables in the `set' output. It doesn't do that for variables that have been assigned attributes but not values; such variables are lost. > $ set -u > $ for i in "${x[@]}"; do :; done > bash: x[@]: unbound variable None of the elements have been assigned a value. > Note also that the "unbound variable" error is inconsistent with the > behaviour of "$@"; I would have thought that, logically, "$@" and > "${x[@]}" should behave the same way, since arrays are implemented as a > logical extension of the positional parameters concept. $@ and $* receive a special carve-out in Posix; they are the only exceptions to set -u. -- ``The lyf so short, the craft so long to lerne.'' - Chaucer ``Ars longa, vita brevis'' - Hippocrates Chet Ramey, ITS, CWRU c...@case.edu http://cnswww.cns.cwru.edu/~chet/