On Wed, Apr 7, 2021 at 9:25 PM Chet Ramey <chet.ra...@case.edu> wrote: > > On 4/5/21 4:45 PM, konsolebox wrote: > > set -u > > array=() > > __ref=array[@] > > : "${array[@]}" # Reports nothing > > This is a special case, mirroring the special case that POSIX carved out > for $@ and $* in 2009. > > > : "${!__ref}" # Unbound variable > > But this is not. Bash looks for __ref, finds it with a value of array[@], > and attempts to expand that. It expands to null (internally), since there > are no array elements, which becomes the value of the parameter expansion. > > Since the expansion (${!__ref}) resulted in the null string, `set -u' kicks > in and bash reports a fatal error.
But that doesn't seem consistent since `set -- "${!__ref}"; echo "$#"` shows 0, meaning it didn't expand to a null string but practically nothing. Does that mean internally ${!__ref} expands to null string but checks for a flag if it's an array expansion before the actual resulting expansion? If that's the case shouldn't it be the same when reporting unbound variable? -- konsolebox