Existe um problema aqui se você tiver uma entrada que não seja previsível (por exemplo, entrada manual). A menos que você possa dizer o futuro, você não pode trivialmente (ou seja, através do while read line
construct) saber o que é o último. Além disso, uma vez que o loop pára quando a entrada é interrompida, você terá que armazenar uma determinada linha e agir sobre ela após sua "volta no loop". Não antes disso, você pode saber se foi o último. Se a entrada for uma string ou arquivo fixo, é mais uma consideração teórica do que prática.
Um protótipo para fazer o que você quer:
unset lastline
while read line; do
if ! [ -z "$lastline" ]; then
echo "$lastline"
fi
lastline=$line
done <<< "$lines"
echo "This is the last one: $lastline"
-
unset lastline
é apenas para "proteger você" se você executar o mesmo script, por exemplo, um terminal várias vezes, já que$lastline
pode não estar vazio para começar. Você também pode limpá-lo após o últimoecho
se isso puder ser um problema. -
! [ -z "$lastline" ]
retornará true se a variável$lastline
não estiver vazia (tecnicamente, se o comprimento da string não for zero). Vejaman test
se você não está acostumado a esses testes.
(Embora meu instinto queira perguntar o que você realmente está tentando fazer a> :-).)