Seu problema é que em um pipeline ( command1 | command2 | command3 ...
) os comandos são executados em subshells. Variáveis não são compartilhadas entre subshells ou entre subshells e o shell principal. O ring
no loop while é diferente do ring
no shell principal.
Uma maneira de superar isso é usar a substituição de processos:
while read line; do ring+=("$line"); echo ${ring[-1]}; done < <(ls -las|tail -n +4)
A sintaxe <(command)
é chamada de substituição do processo e redirecionará a saída do comando para um canal nomeado. Que é então redirecionado com o familiar <
como se fosse um arquivo. Quando você usa <
, não há subshell, então a variável ring
será definida.
Observe que há um comando interno do shell para preencher uma matriz das linhas de um arquivo:
mapfile -t ring < <(ls -las | tail -n +4)