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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.