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.
while read...
ist oft die empfohlene Methode.cat -v /path/to/script
ähnliche Zeilenenden, indem Sie es mit drucken und am Ende der Zeilen nach "^ M" suchen .Antworten:
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.
quelle
Dieses Skript hat CR LF-Zeilenenden. Dies ist besser sichtbar mit
od
.Wie Sie sehen können, habe ich am Ende jeder Zeile
\r
(Wagenrücklauf) und\n
(Zeilenvorschub) Zeichen, wo Sie nur\n
Zeichen haben sollten . Dies ist auf ein Kompatibilitätsproblem zwischen Windows- und * nix-Systemen zurückzuführen. Bash hat Schwierigkeiten mit den\r
Charakteren umzugehen .Sie können Ihr Skript reparieren, indem Sie ein Hilfsprogramm wie
dos2unix
das folgende verwenden oder den folgendensed
Befehl ausführen:quelle