2 Ağustos 2020 Pazar tarihinde Lawrence Velázquez <v...@larryv.me> yazdı:
> > 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 > > `u' has no members, so there's nothing to expand. If you use `${u[0]}' for example, you'll see an error, I think how bash and ksh behave is perfectly reasonable. > > 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> > > `typeset -i v' doesn't assign `v', just gives it the integer attribute. Again, I can't see any problem with bash and ksh here. > ...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 > -- Oğuz