Problema com o script de linha de leitura no Cygwin

3

Estou no Windows 7 usando o Cygwin.

Meu script e arquivo de texto estão localizados no mesmo diretório.

#!/bin/bash
while read name; do
echo "Name read from file - $name"
done < /home/Matt/servers.txt

Eu recebo este erro e não sei porque porque isso está correto enquanto a sintaxe do loop ..?

u0146121@U0146121-TPD-A ~/Matt
$ ./script.sh
./script.sh: line 4: syntax error near unexpected token 'done'
./script.sh: line 4: 'done < /home/Matt/servers.txt'

Alguém pode me dizer o que estou fazendo errado? Eu acho que é porque eu estou no windows e usando o Cygwin.

    
por mkrouse 01.07.2013 / 17:40

4 respostas

1

Como apontou por ott-- , seu script tem CR LF finais de linha. Isso é mais visível com od .

$ od -c script
0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n   w   h   i
0000020   l   e       r   e   a   d       n   a   m   e   ;       d   o
0000040  \r  \n   e   c   h   o       "   N   a   m   e       r   e   a
0000060   d       f   r   o   m       f   i   l   e       -       $   n
0000100   a   m   e   "  \r  \n   d   o   n   e       <       /   h   o
0000120   m   e   /   M   a   t   t   /   s   e   r   v   e   r   s   .
0000140   t   x   t  \r  \n
0000145

Como você pode ver, você tem os caracteres \r (retorno de carro) e \n (alimentação de linha) no final de cada linha, onde você deve ter apenas \n caracteres. Isso é resultado de um problema de compatibilidade entre os sistemas Windows e * nix. O Bash tem dificuldade em lidar com os caracteres \r .

Você pode corrigir seu script usando um utilitário como dos2unix ou executando a seguinte linha.

sed -i 's/\r$//' script
    
por 02.07.2013 / 00:28
1

Este é o seu script com o hexdump

00000000  23 21 2f 62 69 6e 2f 62  61 73 68 0d 0a 77 68 69  |#!/bin/bash..whi|
00000010  6c 65 20 72 65 61 64 20  6e 61 6d 65 3b 20 64 6f  |le read name; do|
00000020  0d 0a 65 63 68 6f 20 22  4e 61 6d 65 20 72 65 61  |..echo "Name rea|

As linhas terminam com 0d 0a aka CR LF . Altere-o para 0a ou LF apenas.

    
por 01.07.2013 / 18:10
1

O arquivo que você está usando tem CR (feeds de linha de estilo do Windows) no final deles (a mesma coisa aconteceu comigo usando o Cygwin no Windows XP).

Use 'dos2unix.exe' para corrigir e você deve estar bem:

$ dos2unix.exe script.sh

dos2unix: converting file script.sh to Unix format...

Em seguida, execute novamente seu script e essas mensagens de erro não devem mais aparecer.

    
por 06.10.2014 / 18:26
0

O problema é que você tem o arquivo de script em um formato não-unix você pode usar:

vi new_name_for_your_script

e copie e cole (você está correndo pelas janelas)

seu problema será resolvido.

    
por 27.04.2016 / 23:49