ao escrever programas Bash, irá por vezes encontrar-se em situações em que precisa de ler um ficheiro linha a linha. Por exemplo, você pode ter um arquivo de texto contendo dados que devem ser processados pelo script.

neste tutorial, vamos discutir como ler um arquivo linha por linha na Bash.,

a Leitura de um Arquivo linha Por Linha, Sintaxe #

A maioria sintaxe geral para a leitura de um arquivo linha a linha é o seguinte:

while IFS= read -r line; do printf '%s\n' "$line"done < input_file

ou o equivalente a única versão de linha:

while IFS= read -r line; do printf '%s\n' "$line"; done < input_file

Como funciona?

o ficheiro de entrada (input_file) é o nome do ficheiro redireccionado para o ciclo de while. The read command processes the file line by line, assigning each line to theline variable. Uma vez que todas as linhas são processadas, o laço while termina.,

Por omissão, o comando read interpreta a barra invertida como um carácter de escape e remove todos os espaços brancos iniciais e finais, que por vezes podem causar um comportamento inesperado. Para desactivar a fuga da barra invertida, estamos a invocar o comando com a opção -r, e para desactivar a limpeza, o separador interno do campo (IFS) está limpo.

estamos usando em vez de echo para tornar o código mais portátil e evitar comportamentos indesejados., Por exemplo, se a linha contiver valores como “-e”, será tratada como uma opção echo.

lendo uma linha de arquivo por linha exemplos #

vamos dar uma olhada no seguinte exemplo. Suponha que temos um arquivo chamado distros.txt que contém uma lista de algumas das mais populares distribuições Linux, e seus gerenciadores de pacotes separados com vírgula (,):

distros.,txt
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf

Para ler o arquivo linha por linha, você deve executar o seguinte código no seu terminal:

while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt

O código lê o arquivo linha a linha, atribui a cada linha a uma variável, e imprime-o. Basicamente, você veria o mesmo resultado como se mostrasse o conteúdo do ficheiro usando o comando cat.

E se quiser imprimir apenas as distribuições que usam o apt?, Uma forma seria o uso de if instrução e verifique se a linha contém o apt subseqüência de caracteres :

while IFS= read -r line; do if ]; then printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt

durante a leitura de um arquivo linha por linha, você também pode passar mais de uma variável para o read comando, que vai dividir a linha em campos com base no IFS. O primeiro campo é atribuído à primeira variável, o segundo à segunda variável, e assim por diante. Se houver mais campos do que variáveis, os campos remanescentes são atribuídos à última variável.,

No exemplo a seguir, temos um conjunto de IFS uma vírgula (,) e passar duas variáveis distro e pm read comando.,erything a partir do início da linha até a primeira vírgula será atribuído à primeira variável (distro), e o restante da linha será atribuído a segunda variável (pm):

while IFS=, read -r distro pm; do printf '%s is the package manager for %s\n' "$pm" "$distro"done < distros.txt
apt is the package manager for Ubuntuapt is the package manager for Debianyum is the package manager for CentOSpacman is the package manager for Arch Linuxdnf is the package manager for Fedora

Alternativa de Leitura de Arquivo Métodos #

a Utilização de um Processo de Substituição #

Processo de substituição é um recurso que permite que você use a saída do comando como de um arquivo:

while IFS= read -r line; do printf '%s\n' "$line"done < <(cat input_file )

Usando um Aqui String #

Aqui Seqüência de caracteres é uma variante do documento Aqui ., A cadeia de caracteres (cat input_file ) mantém as quebras de linha:

while IFS= read -r line; do printf '%s\n' "$line"done <<< $(cat input_file )

Usando o Arquivo de descritor de #

Você também pode fornecer a entrada para o loop usando um descritor de arquivo:

while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file

Ao trabalhar com descritores de arquivo , use um número entre 4 e 9 para evitar o conflito com concha interna de descritores de arquivo.

Conclusion #

In Bash, we can read a file line-by-line using a while loop and the read command.