No seu link, a variável usada fora (linecount) não é definida como uma variável "loop". É apenas modificado (incrementado) dentro do loop do corpo, mas não na instrução "while".
Isso ocorre porque quando a parte "read -r f1 f2 ..." é chamada, reinicializa (prepara) as variáveis usadas (f1 ..f7) , espera por uma linha de entrada e atribuir as variáveis de acordo com a entrada. No final do arquivo, ele não obtém nenhuma linha de entrada (EOF ou Pipe Error), retorna false e sai do loop. Mas já redefiniu as variáveis.
Você pode descobrir por si mesmo ativando o "modo de depuração" adicionando set -x
antes da instrução while
.
Isso produzirá algo como:
++ IFS=:
++ read -r f1 f2 f3 f4 f5 f6 f7
++ echo 'Username: bind. Home directory:/var/cache/bind'
Username: bind. Home directory:/var/cache/bind
++ IFS=:
++ read -r f1 f2 f3 f4 f5 f6 f7
++ echo
Você pode ver a última leitura sendo chamada e, em seguida, seu "echo $ f1" final.
Assim, conforme indicado no link, crie outra variável de armazenamento antes de você atribuir o valor e, em seguida, você poderá usá-lo:
typeset f0=""
while IFS=: read -r f1 f2 f3 f4 f5 f6 f7; do
echo "Username: $f1. Home directory:$f6"
f0="$f1"
done</etc/passwd
echo $f0