Variáveis fora do loop while

5

Estou tentando fazer eco das variáveis $f1 , $f2 , etcetera , fora do loop while mostrado abaixo. Pelo que entendi, o escopo da variável não está correto. Por isso, tentei algumas das soluções alternativas mostradas aqui: link

while IFS=: read -r f1 f2 f3 f4 f5 f6 f7; do
  echo "Username: $f1. Home directory:$f6"
done</etc/passwd

echo $f1

No entanto, parece que não consigo reproduzir a (s) correção (s) como mostrado no link. Alguém pode fornecer um exemplo aplicado sobre como corrigir esse problema?

    
por ses 27.07.2015 / 15:43

1 resposta

3

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
    
por 27.07.2015 / 16:07