Antworten:
Ich denke, file.sh ist mit CRLF-Zeilenabschlusszeichen.
Lauf
dos2unix file.sh
dann wird das Problem behoben.
Sie können dos2unix in Ubuntu folgendermaßen installieren:
sudo apt-get install dos2unix
Eine andere Sache zu überprüfen (ist mir gerade eingefallen):
Dh dieser unschuldig aussehende Ausschnitt verursacht den gleichen Fehler:
die () { test -n "$@" && echo "$@"; exit 1 }
Um den dummen Parser glücklich zu machen:
die () { test -n "$@" && echo "$@"; exit 1; }
;dass erwartet wird, dass jede Aussage mit ;so endet , dass am Ende zB: if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fidieser Fehler erzeugt wird, während if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;... die kleinen Semikolons am Ende nicht bemerkt werden, dh: nach .bashund fi.
zshBenutzer mitgeteilt wurde. Ersteres funktioniert in, zshaber nicht in shnoch bash. Ich wünschte, ich wäre 4 Leute, damit ich diese 4 Upvotes geben könnte
Ich habe auch gerade diese Fehlermeldung erhalten, indem ich die falsche Syntax in einer ifKlausel verwendet habe
else if (Syntaxfehler: unerwartetes Dateiende) elif (korrekte Syntax)Ich debuggte es, indem ich Bits auskommentierte, bis es funktionierte
Eine nicht geschlossene if => fi-Klausel löst dies ebenfalls aus
Tipp: Verwenden Sie Trap zum Debuggen, wenn Ihr Skript sehr umfangreich ist ...
z.B
set -x
trap read debug
unexpected end of fileFehler auftritt, sobald der figetroffen wird.
Ich habe diese Antwort von diesem ähnlichen Problem auf StackOverflow erhalten
Öffnen Sie die Datei in Vim und versuchen Sie es
:set fileformat=unix
Konvertieren Sie eh-Zeilenenden in Unix-Endungen und prüfen Sie, ob das Problem dadurch behoben wird. Geben Sie beim Bearbeiten in Vim den folgenden Befehl ein: set fileformat = unix und speichern Sie die Datei. Mehrere andere Editoren können Zeilenenden konvertieren, z. B. Notepad ++ oder Atom
Danke @lemongrassnginger
dos2unixwie in der akzeptierten Antwort angegeben.
Also fand ich diesen Beitrag und die Antworten halfen mir nicht, aber ich konnte herausfinden, warum es mir den Fehler gab. Ich hatte ein
cat > temp.txt < EOF
some content
EOF
Das Problem war, dass ich den obigen Code kopiert habe, um in einer Funktion zu sein, und den Code versehentlich mit Registerkarten versehen habe. Stellen Sie sicher, dass der letzte EOF nicht mit Registerkarten versehen ist.
EOFvier Leerzeichen eingerückt und Bash hat es deswegen nicht analysiert. Das Entfernen von Leerzeichen hat das Problem behoben.
Dies geschah für mich, als ich versuchte, eine Funktion mit Parens aufzurufen, z
run() {
echo hello
}
run()
sollte sein:
run() {
echo hello
}
run
FÜR WINDOWS:
In meinem Fall habe ich unter Windows gearbeitet und beim Ausführen von autoconf den gleichen Fehler erhalten.
Dann habe ich die Datei mit EOL- Konvertierung in Windows (CR LF) wie folgt konvertiert :
BEARBEITEN -> EOL-KONVERTIERUNG -> FENSTER (CR LF)
Ich konnte Ihren Code ausschneiden und in eine Datei einfügen, die ordnungsgemäß ausgeführt wurde. Wenn Sie es so ausführen, sollte es funktionieren:
Ihre "file.sh":
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Der Befehl:
$ ./file.sh arg1 arg2 arg3
Beachten Sie, dass "file.sh" ausführbar sein muss:
$ chmod +x file.sh
Möglicherweise erhalten Sie den Fehler b / c, wie Sie Eingaben machen (mit Pfeife, Karotte usw.). Sie können auch versuchen, die Bedingung in zwei Teile aufzuteilen:
if [ $# -lt 3 ] || [ $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Da Sie verwenden bash, können Sie auch die integrierte Syntax verwenden:
if [[ $# -lt 3 || $# -gt 3 ]]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Und schließlich können Sie natürlich auch überprüfen, ob 3 Argumente angegeben wurden (sauber, behält die POSIX-Shell-Kompatibilität bei):
if [ $# -ne 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Ich habe gerade Ihr Beispiel ausgeschnitten und in eine Datei eingefügt. es lief gut unter Bash. Ich sehe keine Probleme damit.
Für ein gutes Maß möchten Sie vielleicht sicherstellen, dass es mit einer neuen Zeile endet, obwohl Bash sich nicht darum kümmern sollte. (Es läuft für mich sowohl mit als auch ohne die letzte Zeile.)
Manchmal werden seltsame Fehler angezeigt, wenn Sie versehentlich ein Steuerzeichen in die Datei eingebettet haben. Da es sich um ein kurzes Skript handelt, versuchen Sie, ein neues Skript zu erstellen, indem Sie es aus Ihrer Frage hier in StackOverflow einfügen oder es einfach erneut eingeben.
Welche Version von Bash verwenden Sie? ( bash --version)
Viel Glück!
Stellen Sie sicher, dass der Name des Verzeichnisses, in dem sich die .sh-Datei befindet, kein Leerzeichen enthält. Beispiel: Wenn Sie sich in einem Ordner mit dem Namen "Neuer Ordner" befinden, werden Sie auf den von Ihnen genannten Fehler stoßen. Nennen Sie es stattdessen einfach "New_Folder". Ich hoffe das hilft.
Ich weiß, ich bin zu spät zur Party. Hoffe das kann jemandem helfen.
Überprüfen Sie Ihre .bashrc-Datei. Vielleicht umbenennen oder verschieben.
Diskussion hier: Es kann kein einfaches Bash-Skript erstellt werden
Das Fehlen einer schließenden Klammer in einer Funktionsdefinition führt zu diesem Fehler, wie ich gerade entdeckt habe.
function whoIsAnIidiot() {
echo "you are for forgetting the closing brace just below this line !"
Was natürlich so sein sollte ...
function whoIsAnIidiot() {
echo "not you for sure"
}
In meinem Fall gibt es eine Redundanz \wie folgt:
function foo() {
python tools/run_net.py \
--cfg configs/Kinetics/X3D_8x8_R50.yaml \
NUM_GPUS 1 \
TRAIN.BATCH_SIZE 8 \
SOLVER.BASE_LR 0.0125 \
DATA.PATH_TO_DATA_DIR ./afs/kinetics400 \
DATA.PATH_PREFIX ./afs/kinetics400 \ # Error
}
Es ist NICHT ein \am EndeDATA.PATH_PREFIX ./afs/kinetics400