Warum gibt ein Shell-Skript Syntaxerrors, wenn derselbe Code anderswo funktioniert?

Ich habe ein einfaches Shell-Skript, das ich aus einem funktionierenden Skript kopiert habe. Es funktioniert, wenn ich es auf ein Terminal kopiere:

if true then true fi 

Wenn ich das Skript mit bash myscript , bash myscript ich verschiedene Syntaxerrors, als ob einige der Schlüsselwörter fehlen würden.

  • myscript: line 4: syntax error near unexpected token `fi' , als ob es then nicht da wäre.
  • myscript: line 6: syntax error: unexpected end of file , als ob fi nicht da wäre.
  • myscript: line 4: syntax error near unexpected token `$'\r' .. was?

Warum passiert das in diesem bestimmten Skript, aber nicht in meiner Befehlszeile oder in dem Skript, von dem ich kopiert habe?

Solutions Collecting From Web of "Warum gibt ein Shell-Skript Syntaxerrors, wenn derselbe Code anderswo funktioniert?"

TL; DR: Ihr Skript hat Windows Stil CRLF Zeilenenden, aka \r\n .

Konvertieren in den Unix-Stil \n durch Löschen der Zeilenumbrüche.


Wie überprüfe ich, ob mein Skript Zeilenumbrüche enthält?

Sie sind als ^M in der Ausgabe von cat -v yourscript :

 $ cat -v myscript if true^M then^M true^M ... 

Wie entferne ich sie?

Stellen Sie Ihren Editor so ein, dass die Datei mit Unix-Zeilenenden, auch als “Zeilenendezeichen” oder “Zeilenendezeichen” bezeichnet, gespeichert und erneut gespeichert wird.

Sie können sie auch mit dos2unix yourscript oder cat yourscript | tr -d '\r' > fixedscript von einer Befehlszeile entfernen cat yourscript | tr -d '\r' > fixedscript .

Warum verursachen Wagenrücklauferrors Syntaxerrors?

Das Carriage Return-Zeichen ist nur ein weiteres Zeichen zum Bash. then ist das nicht dasselbe wie then\r , also erkennt Bash es nicht als ein Schlüsselwort und nimmt an, dass es ein Befehl ist. Es sucht dann nach einem und scheitert

Wenn nachher ein Leerzeichen then , erhalten Sie ein ähnliches Problem für fi .