Q1. A substituição de comandos (backticks) usa um subshell e, em zsh, o estado RNG de um subshell não é propagado novamente. Como você cria repetidamente um novo subshell sem usar $RANDOM
no pai, você obtém o mesmo valor em cada subshell. Veja:
link - < href="https://superuser.com/questions/1210435/different-behavior-of-in-zsh-and-bash-functions"> link
Você não precisa do comando-substitution e echo, e você também não precisa do $((..))
porque um subscrito do array já é avaliado como uma expressão aritmética, mas você precisa do +1 porque o zsh arrays é 1- origem (você teve sorte de não ter acertado 0):
out=$out${charlists[ $RANDOM % ${#charlists[*]} + 1 ]}
Além de: mesmo se você precisou de uma substituição de comando echo
em você não precisa de -n
porque a própria substituição de comando remove qualquer nova linha (s) à direita dos dados capturados e substituídos.
Q2. O bash faz a expansão de chaves antes de fazer a expansão de parâmetros (e substituições e expansões de comandos e aritméticas), mas zsh (e ksh) faz isso depois. Você pode usar for i in $(seq 1 $1)
ou yucky mas incorporado em for i in $(eval "echo {1..$n}")