For example:
$ # a[0] is not set, but no error
$ bash -uc 'a=() k=; declare -n r=a[k]; : "$r"; echo ok'
ok
$ # a[0] is not set, error
$ bash -uc 'a=() k=; declare -n r=a[k]; : "${r}"; echo ok'
bash: line 1: r: unbound variable
Can reproduce in bash 5.2.37, and devel branch.
Bash modifies the parameter_expand flags before calling
parameter_brace_expand_word() when using ${r} in this case,
subst.c:10072-10075 (devel 535a8150b65ee6888f54f602274dbbdcd77c788e)
else
{
local_pflags |= PF_IGNUNBOUND|(pflags&(PF_NOSPLIT2|PF_ASSIGNRHS));
tdesc = parameter_brace_expand_word (name, var_is_special, quoted,
local_pflags, &es);
but it does not do that before calling it when using $r
subst.c:10973-10976 (devel 535a8150b65ee6888f54f602274dbbdcd77c788e)
if (temp && *temp && valid_array_reference (temp, 0))
{
chk_atstar (temp, quoted, pflags, quoted_dollar_at_p,
contains_dollar_at);
tdesc = parameter_brace_expand_word (temp, SPECIAL_VAR (temp, 0),
quoted, pflags, 0);
Maybe that is related to why this is happening.
o/
emanuele6