Leia os arquivos no script de shell não imprime nada?

3

Eu estou tentando ler um arquivo do shell script linha por linha. Abaixo está o meu conteúdo de arquivo -

hello=world

E abaixo está o meu script de shell que escrevi -

#!/bin/bash

while read -r line; do
       echo "$line"
    done < test.txt

Mas de alguma forma, sempre que estou correndo do meu terminal cygiwn, não vejo nenhum resultado sendo impresso no console -

Eu corro assim -

$ sh read.sh

E isso não imprime nada. E não tenho certeza do que estou fazendo de errado aqui.

    
por SSH 17.12.2013 / 01:07

1 resposta

5

No mundo unix, uma nova linha é um terminador de linha, não um separador de linha. Um arquivo de texto consiste em uma série de linhas, cada uma das quais é terminada por um caractere de nova linha. Esse é um caractere de avanço de linha (número de caractere 10, que pode ser representado como LF , ^J , 2 , \x0a , \n ,…). Veja Qual é o objetivo de adicionar uma nova linha ao final de um arquivo?

Em particular, todo arquivo de texto não vazio termina com um caractere de nova linha. O Windows às vezes funciona de maneira diferente: em alguns aplicativos, (mas nem todos! O Windows não é consistente), uma seqüência CR LF (retorno de carro, alimentação de linha, também conhecido como ^M^J , 52 , \x0d\x0a , \r\n ,…) separa linhas, portanto, um arquivo que termina em CRLF é um arquivo que termina em uma linha em branco. Portanto, tenha cuidado ao usar um editor do Windows para editar arquivos que devem ser usados no futuro:

  • Eles adicionam esse caractere CR extra antes do caractere de nova linha, que alguns aplicativos Unix (em especial shells) tratam como um caractere comum, parte da linha.
  • Eles fazem você acreditar que há uma linha em branco após o último caractere de nova linha, enquanto a última nova linha termina a última linha.

Se um arquivo não estiver vazio e não terminar em uma nova linha, não será um arquivo de texto unix bem formado. Alguns aplicativos reagem ignorando a última linha parcial ou truncando-a. É o que está acontecendo aqui: você passou um arquivo de texto incompleto para o bash e está ignorando a última linha incompleta.

    
por 17.12.2013 / 01:30