This is possibly relevant to some of Grisha's observations. First, declaring or assigning to a variable with a subscript. I think I would prefer these to be errors for various reasons. Admittedly there's an argument for making one or both of these non-errors for declarations without assignment for consistency with the current documentation, and maybe even allowing the current behavior (no errors ever). I think that leads to confusion though.
$ bash -c 'typeset -n ref[0]=foo' # no error $ bash -c 'typeset -n ref[1]=foo' # no error The other variations on this theme are if there are references to "arrays" with or without a zero subscript. Bash example: $ bash -xc ' typeset -n ref1=a1 ref2=a2 ref3=a3[0] ref4=a4[0] ref1=foo ref2[0]=foo ref3=foo ref4[0]=foo echo "${ref1} ${ref2[0]} ${ref3} ${ref4[0]}" typeset -p {ref,a}{1,2,3,4}' + typeset -n ref1=a1 ref2=a2 'ref3=a3[0]' 'ref4=a4[0]' + ref1=foo + ref2[0]=foo + ref3=foo + ref4[0]=foo + echo 'foo foo foo foo' foo foo foo foo + typeset -p ref1 ref2 ref3 ref4 a1 a2 a3 a4 declare -n ref1="a1" declare -a ref2=([0]="foo") declare -n ref3="a3[0]" declare -a ref4=([0]="foo") declare -- a1="foo" /home/ormaaj/doc/programs/bash-build/bash: line 4: typeset: a2: not found declare -a a3=([0]="foo") /home/ormaaj/doc/programs/bash-build/bash: line 4: typeset: a4: not found I think the mksh result for that code is most like what bash is probably going for. It mostly treats `ref[0]` as `ref` both when assigning and dereferencing. $ mksh -xc ' typeset -n ref1=a1 ref2=a2 ref3=a3[0] ref4=a4[0] ref1=foo ref2[0]=foo ref3=foo ref4[0]=foo echo "${ref1} ${ref2[0]} ${ref3} ${ref4[0]}" typeset -p {ref,a}{1,2,3,4}' + typeset -n 'ref1=a1' 'ref2=a2' 'ref3=a3[0]' 'ref4=a4[0]' + ref1=foo ref2[0]=foo ref3=foo ref4[0]=foo + echo 'foo foo foo foo' foo foo foo foo + typeset -p ref1 ref2 ref3 ref4 a1 a2 a3 a4 typeset -n ref1=a1 typeset -n ref2=a2 typeset -n ref3='a3[0]' typeset -n ref4='a4[0]' typeset a1=foo set -A a2 typeset a2[0]=foo set -A a3 typeset a3[0]=foo set -A a4 typeset a4[0]=foo ksh93 also does that except ref4 which understandably assigns to a4[0][0].