> On Aug 1, 2020, at 8:47 PM, Lawrence Velázquez <v...@larryv.me> wrote: > > Presumably none of these shells implements u+=(t) as u=("${u[@]}" t).
Granted, they do disagree on ${u[@]}. % bash -c 'set -u; unset u; u=("${u[@]}" t); typeset -p u' declare -a u=([0]="t") % ksh -c 'set -u; unset u; u=("${u[@]}" t); typeset -p u' typeset -a u=(t) % zsh -c 'set -u; unset u; u=("${u[@]}" t); typeset -p u' zsh:1: u[@]: parameter not set > I haven't seen the code for arithmetic expansion, but I assume it > treats v+=1 as morally equivalent to v=${v}+1 (à la C99). Thus there > *is* an expansion, which fails under set -u. Regardless of the > particulars, ksh and zsh again agree: > > % bash -c 'set -u; unset v; let v+=1; printf "<%s>\\n" "$v"' > bash: v: unbound variable > % ksh -c 'set -u; unset v; let v+=1; printf "<%s>\\n" "$v"' > ksh: let: v: parameter not set > ksh: v: parameter not set > % zsh -c 'set -u; unset v; let v+=1; printf "<%s>\\n" "$v"' > zsh:1: v: parameter not set > zsh:1: v: parameter not set On the other hand... % bash -c 'set -u; typeset -i v; printf "<%s>\\n" "$v"' bash: v: unbound variable % ksh -c 'set -u; typeset -i v; printf "<%s>\\n" "$v"' ksh: v: parameter not set % zsh -c 'set -u; typeset -i v; printf "<%s>\\n" "$v"' <0> ...and... % bash -c 'set -u; typeset -i v; v+=1; printf "<%s>\\n" "$v"' <1> % ksh -c 'set -u; typeset -i v; v+=1; printf "<%s>\\n" "$v"' <1> % zsh -c 'set -u; typeset -i v; v+=1; printf "<%s>\\n" "$v"' <1> *shrug* vq