declare -n name=value, when name is already a nameref, shows the following
presumably inconsistent behavior:
Given a chain of namerefs like:
ref_1 -> ref_2 -> ... -> ref_i ... -> ref_N [-> var]
- If ref_N points to a name that is not a nameref, the operations declare
-n ref_N=value and declare +n ref_N modify the value/attributes of ref_N
(this seems to be the desired behavior)
- For i<N, declare -n ref_i=value and declare +n ref_i modify the
value/attributes of ref_N and not of ref_i
- If ref_N is declared as a nameref but unset, then these operations on
ref_i have no effect.
For example, starting with:
unset -n ref{1..3}declare -n ref1=ref2 ref2=ref3 ref3=var1
# declare -n *ref1*=*var2*# declare -p ref{1..4}declare -n ref1="ref2"
# unchangeddeclare -n ref2="ref3"declare -n *ref3*="*var2*" #
changed
# declare +n *ref1*# declare -p ref{1..3}declare -n ref1="ref2" #
unchangeddeclare -n ref2="ref3"declare -- *ref3*="var1" # changed,
no loner nameref
Or alternatively:
unset -n ref{1..3}declare -n ref1=ref2 ref2=ref3 ref3
# declare +n ref1# declare -p ref{1..3}declare -n ref1="ref2" #
unchangeddeclare -n ref2="ref3" # unchangeddeclare -n ref3
# unchanged
# declare -n ref1=var1# declare -p ref{1..3}declare -n
ref1="ref2"declare -n ref2="ref3"declare -n ref3
The man page says:
All references, assignments, and attribute modifications to name, except
for changing the -n attribute itself, are performed on the variable
referenced by name’s value.
This does not appear to be the case, as declare -n ref_N=value changes
$ref_N, not $value, and declare +n ref_i changes ref_N.