Risposte:
Penso che file.sh sia con terminatori di riga CRLF.
correre
dos2unix file.sh
allora il problema sarà risolto.
Puoi installare dos2unix in Ubuntu con questo:
sudo apt-get install dos2unix
Un'altra cosa da controllare (mi è appena accaduta):
Cioè questo snippet dall'aspetto innocente causerà lo stesso errore:
die () { test -n "$@" && echo "$@"; exit 1 }
Per rendere felice lo stupido parser:
die () { test -n "$@" && echo "$@"; exit 1; }
;è che ci si aspetta che l'istruzione Every finisca con in ;modo che alla fine es: if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fiprodurrà quell'errore, mentre if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;non ... noterà i piccoli punti e virgola alla fine, cioè: dopo .bashe fi.
zshutente. Il primo funziona zshma non in shnor bash. Vorrei essere in 4 persone in modo da poter dare questi 4 voti positivi
Inoltre ho appena ricevuto questo messaggio di errore utilizzando la sintassi sbagliata in una ifclausola
else if (errore di sintassi: fine del file imprevisto) elif (sintassi corretta)ho eseguito il debug commentando i bit fino a quando non ha funzionato
una clausola if => fi non chiusa solleverà anche questo
suggerimento: usa trap per eseguire il debug, se il tuo script è enorme ...
per esempio
set -x
trap read debug
unexpected end of fileerrore si verificherà non appena fiviene colpito.
Ho ottenuto questa risposta da questo problema simile su StackOverflow
Apri il file in Vim e prova
:set fileformat=unix
Converti le terminazioni di linea eh in terminazioni unix e vedi se questo risolve il problema. Se si modifica in Vim, immettere il comando: set fileformat = unix e salvare il file. Molti altri editor hanno la capacità di convertire le terminazioni di riga, come Notepad ++ o Atom
Grazie @lemongrassnginger
dos2unixcome suggerisce la risposta accettata.
Quindi ho trovato questo post e le risposte non mi hanno aiutato, ma sono stato in grado di capire perché mi ha dato l'errore. Ho avuto una
cat > temp.txt < EOF
some content
EOF
Il problema era che ho copiato il codice sopra per essere in una funzione e ho inavvertitamente tabulato il codice. È necessario assicurarsi che l'ultimo EOF non sia tabulato.
EOFrientrato di quattro spazi e bash non l'ha analizzato per questo motivo. La rimozione degli spazi ha risolto il problema.
Questo stava accadendo per me quando stavo cercando di chiamare una funzione utilizzando parentesi, ad es
run() {
echo hello
}
run()
dovrebbe essere:
run() {
echo hello
}
run
PER FINESTRE:
Nel mio caso, stavo lavorando su un sistema operativo Windows e ho ricevuto lo stesso errore durante l'esecuzione di autoconf.
Quindi ho convertito il file con conversione EOL in Windows (CR LF) come segue:
MODIFICA -> CONVERSIONE EOL -> WINDOWS (CR LF)
Sono riuscito a tagliare e incollare il tuo codice in un file e ha funzionato correttamente. Se lo esegui in questo modo dovrebbe funzionare:
Il tuo "file.sh":
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Il comando:
$ ./file.sh arg1 arg2 arg3
Nota che "file.sh" deve essere eseguibile:
$ chmod +x file.sh
Potresti ricevere quell'errore b / c su come stai facendo l'input (con una pipa, una carota, ecc.). Puoi anche provare a dividere la condizione in due:
if [ $# -lt 3 ] || [ $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Oppure, poiché stai utilizzando bash, potresti utilizzare la sintassi incorporata:
if [[ $# -lt 3 || $# -gt 3 ]]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
E, infine, puoi ovviamente controllare se sono stati forniti 3 argomenti (pulito, mantiene la compatibilità della shell POSIX):
if [ $# -ne 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Ho appena tagliato e incollato il tuo esempio in un file; ha funzionato bene sotto bash. Non vedo alcun problema con esso.
Per buona misura potresti assicurarti che finisca con una nuova riga, anche se a bash non dovrebbe importare. (Funziona sia con che senza il ritorno a capo finale.)
A volte vedrai strani errori se hai accidentalmente incorporato un carattere di controllo nel file. Poiché è uno script breve, prova a creare un nuovo script incollandolo dalla tua domanda qui su StackOverflow o semplicemente riscrivendolo.
Quale versione di bash stai usando? ( bash --version)
In bocca al lupo!
Assicurati che il nome della directory in cui è presente il file .sh non abbia uno spazio. es: dì che se si trova in una cartella chiamata "Nuova cartella", ti imbatterai sicuramente nell'errore che hai citato. Invece chiamalo semplicemente "New_Folder". Spero che aiuti.
So di essere troppo tardi per la festa. Spero che questo possa aiutare qualcuno.
Controlla il tuo file .bashrc. Forse rinominalo o spostalo.
Discussione qui: Impossibile trovare un semplice script bash
La mancanza di una parentesi graffa di chiusura nella definizione di una funzione causerà questo errore come ho appena scoperto.
function whoIsAnIidiot() {
echo "you are for forgetting the closing brace just below this line !"
Che ovviamente dovrebbe essere così ...
function whoIsAnIidiot() {
echo "not you for sure"
}
Nel mio caso, c'è una ridondanza \in quanto segue:
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
}
C'è NON una \alla fine delDATA.PATH_PREFIX ./afs/kinetics400