{A..z}
expande de acordo com a codificação de caracteres de sua localidade atual, que provavelmente é ASCII ou algo próximo a ela. Se você executar man ascii
(no caso de ter isso no seu sistema) ou dar uma olhada em uma tabela ASCII , verá esses caracteres adicionais em entre Z
e a
(o mesmo que você obtém quando executa echo {Z..a}
na verdade).
Para obter apenas caracteres maiúsculos / minúsculos, use
echo {A..Z} {a..z}
Para obter apenas os que estão no meio, você pode usar
typeset -a foo=($(echo {Z..a}))
echo ${foo[@]:1:((${#foo[@]} - 2))}
que cria uma matriz primeiro incluindo os dois caracteres fora do limite e depois acessa todos os elementos da matriz além dos caracteres de limite.
PS: Descobrir por que typeset -a foo=({Z..a})
não funciona é deixado como um exercício para o leitor :-)