Linha por linha não está funcionando

1

Script

FILE="/u0146121/bin/list.txt"
while read line; do 
echo $line 
done < $FILE

Eu sou novo no bash scripting e tentando descobrir esse loop while. Eu quero ler linha por linha a partir de um arquivo de texto e, em seguida, fazer um comando.

Continuo recebendo o erro:

 No such file or directory121/bin/list.txt

Alguém sabe como consertar isso?

    
por mkrouse 01.07.2013 / 16:10

3 respostas

3

Eu suspeito que seu script pode ter finais de linha no estilo DOS. No DOS (e no Windows), cada linha de um arquivo de texto termina com o retorno de carro (variavelmente representado como \r ou ^M ) seguido por um avanço de linha ( \n ou ^J ). Os arquivos de texto Unix, por outro lado, terminam cada linha com apenas um avanço de linha. Se você der uma ferramenta unix (como bash) um arquivo formatado no DOS, ele interpretará o retorno de carro como parte da linha e ficará bastante confuso. Nesse caso, parece-me que FILE está sendo definido como /u0146121/bin/list.txt^M , o que não existe, e quando o shell relata o problema, o retorno de carro confunde o terminal e o fim da mensagem de erro é impresso por cima do o começo.

Para verificar, tente imprimir seu script com cat -v /path/to/script - se você vir ^ M no final das linhas, terá um arquivo no formato DOS. Seu sistema provavelmente tem um comando para traduzi-lo, mas o nome do comando varia (por exemplo, pode ser dos2unix ou fromdos ou ...). Se você não consegue encontrar um comando relevante, você pode usar este script perl trivial:

perl -pi -e 's/\r//g' /path/to/script
    
por 01.07.2013 / 19:03
0

Você provavelmente não está nos mostrando exatamente o que está fazendo. A mensagem de erro é

No such file or directory121/bin/list.txt

que mostra que $FILE contém 121/bin/list.txt em vez de /u0146121/bin/list.txt , por isso só posso imaginar que você não está realmente executando FILE="/u0146121/bin/list.txt" , mas FILE="121/bin/list.txt" .

Em qualquer caso, tente executá-lo sem definir uma variável para ver se funciona:

while read line; do 
  echo $line;
done < /u0146121/bin/list.txt
    
por 01.07.2013 / 16:46
-1

Tente

FILE="/u0146121/bin/list.txt"
while read line; do 
echo $line 
done < cat $FILE
    
por 01.07.2013 / 16:58

Tags