Escolar Documentos
Profissional Documentos
Cultura Documentos
Junho 2014
Prembulo
Um dos erros mais comuns no aprendizado dos scripts "bash" no GNU/LInux para ler um
arquivo, linha por linha, usar um loop "FOR" (for line in $(cat file.txt); do ...), que neste exemplo,
leva a uma avaliao, no de cada linha do arquivo mas, de cada palavra ! O que no o
objetivo da coisa... Exemplo de sada com o ciclo vicioso "FOR" :
for line in $(cat file.txt); do echo "$line" ; done
Esta
a
linha
n
1
Esta
a
linha
n
2
Esta
[...]
A soluo consiste em utilizar um loop " WHILE " ligado ao comando interno "READ". No
entanto, voc pode obter o mesmo resultado com um loop "For", mas voc dever trocar o valor
da varivel "$IFS" (Internal Field Separator, separador do campo interno) antes de executar o
loop. Isto o que veremos a seguir...
Loop WHILE
O loop " WHILE " continua a ser o mtodo mais prtico e simples para ler um arquivo, linha por
linha.
Sintaxe
while read linha
de
comando
done < arquivo
Exemplo
O arquivo de origem :
Esta a linha n 1
Esta a linha n 2
Esta a linha n 3
Esta a linha n 4
Esta a linha n 5
As instrues em linha de comando:
while read line; do echo -e "$linen"; done < file.txt
ou em um script "bash" :
#! /bin/bash
while read line
do
echo -e "$linen"
done < file.txt
Sada na tela (stdout):
Esta a linha n 1
Esta a linha n 2
Esta a linha n 3
Esta a linha n 4
Esta a linha n 5
Dicas
Voc pode, a partir de um arquivo bem estruturado (como um caderno de endereos ou
/etc/passwd por exemplo), recuperar os valores de cada campo e distribu-los diversas
variveis com o comando "read". No entanto, no esquea de definir a varivel "IFS", o
separador de campo correto (espao padro). Exemplo :
#! /bin/bash
while IFS=: read user pass uid gid full home shell
do
echo -e "$full :n
Pseudo : $usern
UID :t $uidn
GID :t $gidn
Home :t $homen
Shell :t $shellnn"
done < /etc/passwd
Vantagem
while read i; do echo -e "Configurao : $i"; done < <(echo -e "anabnc")
Loop FOR
Apesar do loop "while" ser o mtodo mais simples, ele tem uma grande desvantagem, ou seja,
ele anula a formatao das linhas e, principalmente, dos espaos e tabulaes ! Felizmente, o
loop "FOR" associado a uma mudana do IFS permite manter a estrutura do documento de
sada.
Sintaxe