Probleme mit der Cygwin-Syntax

0

Ich bin auf Windows 7 mit Cygwin.

Mein Skript und meine Textdatei befinden sich im selben Verzeichnis.

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

Ich erhalte diesen Fehler und weiß nicht warum, da dies während der Schleifensyntax korrekt ist.

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'

Kann mir jemand sagen, was ich falsch mache? Ich denke, das liegt daran, dass ich mit Windows arbeite und Cygwin verwende.

mkrouse
quelle
Meinst du, es hat unter Unix funktioniert?
Golimar
@golimar nicht nie getestet
mkrouse
Warum machst du keine for-Schleife? IMHO wäre es viel lesbarer (sorry, es beantwortet die Frage nicht)
pataluc
@pataluc: Da while read...ist oft die empfohlene Methode.
Grawity
1
Überprüfen Sie das Skript auf DOS- cat -v /path/to/scriptähnliche Zeilenenden, indem Sie es mit drucken und am Ende der Zeilen nach "^ M" suchen .
Gordon Davisson

Antworten:

0

Die vorherige Antwort ist korrekt, da Windows \ r \ n platziert, aber * nix-Systeme nur \ n akzeptieren. Es gibt jedoch eine äußerst einfache Möglichkeit, dies auf einem Windows-Computer zu lösen.

Wählen Sie in einem Texteditor wie Textpad "Speichern unter" und unter dem Dateinamen "Zeilenende". Speichern Sie es hier als "UNIX", und die Datei wird ordnungsgemäß mit \ r codiert, und Ihre Skripte funktionieren einwandfrei.

Olfaktorischer Kegel
quelle
0

Dieses Skript hat CR LF-Zeilenenden. Dies ist besser sichtbar mit 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

Wie Sie sehen können, habe ich am Ende jeder Zeile \r(Wagenrücklauf) und \n(Zeilenvorschub) Zeichen, wo Sie nur \nZeichen haben sollten . Dies ist auf ein Kompatibilitätsproblem zwischen Windows- und * nix-Systemen zurückzuführen. Bash hat Schwierigkeiten mit den \rCharakteren umzugehen .

Sie können Ihr Skript reparieren, indem Sie ein Hilfsprogramm wie dos2unixdas folgende verwenden oder den folgenden sedBefehl ausführen:

sed -i 's/\r$//' script
mkrouse
quelle