A seguir, um arquivo passado como um argumento linha por linha:
while IFS= read -r line; do
echo "Text read from file: $line"
done < my_filename.txt
Este é o formulário padrão para ler linhas de um arquivo em um loop. Explicação:
IFS=
(ou IFS=''
) impede que os espaços em branco à esquerda / à direita sejam cortados.
-r
impede que as fugas de barra invertida sejam interpretadas.
Ou você pode colocá-lo em um script auxiliar de arquivo bash, como exemplo de conteúdo:
#!/bin/bash
while IFS= read -r line; do
echo "Text read from file: $line"
done < "$1"
Se o acima foi salvo em um script com nome de arquivo readfile
, ele poderá ser executado da seguinte maneira:
chmod +x readfile
./readfile filename.txt
Se o arquivo não for um arquivo de texto POSIX padrão (= não finalizado por um caractere de nova linha), o loop poderá ser modificado para manipular linhas parciais finais:
while IFS= read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < "$1"
Aqui, || [[ -n $line ]]
impede que a última linha seja ignorada se não terminar com a \n
(desde que read
retorna um código de saída diferente de zero quando encontrar EOF).
Se os comandos dentro do loop também lerem da entrada padrão, o descritor de arquivo usado read
pode ser alterado para outra coisa (evite os descritores de arquivo padrão ), por exemplo:
while IFS= read -r -u3 line; do
echo "Text read from file: $line"
done 3< "$1"
(Os shells não Bash podem não saber read -u3
; use em read <&3
vez disso.)