Errore di syntax di Bash: fine del file imprevisto

Perdonami, per questo è uno script molto semplice in Bash. Ecco il codice:

#!/bin/bash # june 2011 if [ $# -lt 3 -o $# -gt 3 ]; then echo "Error... Usage: $0 host database username" exit 0 fi 

dopo aver eseguito sh file.sh:

Errore di syntax: fine del file inaspettata

Penso che file.sh sia con terminatori di riga CRLF.

correre

 dos2unix file.sh 

allora il problema verrà risolto.

Puoi installare dos2unix in ubuntu con questo:

 sudo apt-get install dos2unix 

Un’altra cosa da verificare (mi è appena capitato):

  • terminare i corpi delle funzioni a riga singola con punto e virgola

Questo snippet dall’aspetto innocente causerà lo stesso errore:

 die () { test -n "[email protected]" && echo "[email protected]"; exit 1 } 

Per rendere felice il parser stupido:

 die () { test -n "[email protected]" && echo "[email protected]"; exit 1; } 

Ho anche ricevuto questo messaggio di errore usando la syntax sbagliata in una clausola if

  • else if (errore di syntax: fine del file inaspettata)
  • elif (syntax corretta)

Ho effettuato il debugging commentando i bit fino a quando non ha funzionato

una clausola non chiusa if => aumenterà anche questo

consiglio: usa trap per eseguire il debug, se il tuo script è enorme …

es. set -x trap read debug ...

su cygwin avevo bisogno di: –

  export SHELLOPTS set -o igncr 

in .bash_profile. In questo modo non ho avuto bisogno di eseguire unix2dos

Così ho trovato questo post e le risposte non mi hanno aiutato, ma sono stato in grado di capire perché mi ha dato l’errore. Avevo un

 cat > temp.txt < EOF some content EOF 

Il problema era che ho copiato il codice precedente per essere in una funzione e ho inavvertitamente inserito il codice. È necessario assicurarsi che l'ultimo EOF non sia tabulato.

Sono stato in grado di tagliare e incollare il 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 di come stai facendo input (con una pipe, una carota, ecc.). Puoi anche provare a suddividere la condizione in due:

 if [ $# -lt 3 ] || [ $# -gt 3 ]; then echo "Error... Usage: $0 host database username" exit 0 fi 

Oppure, dal momento che stai usando bash , puoi usare la syntax integrata:

 if [[ $# -lt 3 || $# -gt 3 ]]; then echo "Error... Usage: $0 host database username" exit 0 fi 

E, infine, si potrebbe ovviamente verificare se sono stati forniti 3 argomenti (clean, 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; è andato bene sotto bash. Non vedo alcun problema con esso.

Per buona misura, si consiglia di assicurarsi che finisca con una nuova riga, sebbene bash non dovrebbe preoccuparsi. (Funziona per me sia con che senza la nuova riga finale).

A volte vedrai strani errori se hai incorporato per sbaglio un carattere di controllo nel file. Poiché si tratta di un breve script, prova a creare un nuovo script incollandolo dalla tua domanda qui su StackOverflow o semplicemente ridigitandolo.

Che 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 un carattere di spazio. Ad esempio: diciamo che se si trova in una cartella chiamata “Nuova cartella”, si è obbligati a trovare l’errore che hai citato. Invece basta chiamarlo come “New_Folder”. Spero che aiuti.

Apparentemente, alcune versioni della shell possono anche emettere questo messaggio quando la riga finale del tuo script manca di una nuova riga.

Ho ricevuto questa risposta da questo problema simile su StackOverflow

Apri il file in Vim e prova

:set fileformat=unix

Convertire le terminazioni di linea eh per unire le terminazioni e vedere se questo risolve il problema. Se si modifica in Vim, immettere il comando: set fileformat = unix e salvare il file. Diversi altri editor hanno la possibilità di convertire terminazioni di riga, come Notepad ++ o Atom

Grazie a @lemongrassnginger

In Ubuntu:

 $ gedit ~/.profile 

Quindi, File -> Save as e imposta la end line su Unix/Linux

Ho avuto il problema quando ho scritto “if – fi” in una riga:

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi

Scrivi multilinea risolto il mio problema:

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi