web-dev-qa-db-fra.com

Erreur de syntaxe Bash: fin de fichier inattendue

Pardonnez-moi, c’est un script très simple dans Bash. Voici le code:

#!/bin/bash
# june 2011

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

après avoir exécuté sh file.sh:

erreur de syntaxe: fin de fichier inattendue

72
markcruz

Je pense que file.sh est avec les terminateurs de ligne CRLF.

courir

dos2unix file.sh

alors le problème sera résolu.

Vous pouvez installer dos2unix dans Ubuntu avec ceci:

Sudo apt-get install dos2unix
102
clyfish

Une autre chose à vérifier (vient de me venir à l'esprit):

  • termine les corps de fonctions simples avec un point-virgule

C'est à dire. Cet extrait d'aspect innocent provoquera la même erreur:

die () { test -n "$@" && echo "$@"; exit 1 }

Pour rendre l'analyseur muet heureux:

die () { test -n "$@" && echo "$@"; exit 1; }
89
ulidtko

je viens aussi de recevoir ce message d'erreur en utilisant une syntaxe incorrecte dans une clause if

  • else if (erreur de syntaxe: fin de fichier inattendue) 
  • Elif (syntaxe correcte)

je l'ai débogué en commentant les bits jusqu'à ce que cela fonctionne

26
marengaz

une clause non-fermée si => fi soulèvera cela aussi

astuce: utilisez trap pour déboguer, si votre script est énorme ...

par exemple. set -x trap read debug ...

10
theRiley

sur cygwin j'avais besoin de: -

 export SHELLOPTS
 set -o igncr

dans .bash_profile. De cette façon, je n'ai pas eu besoin de lancer unix2dos 

6
zzapper

J'ai eu cette réponse de ce problème similaire sur StackOverflow

Ouvrez le fichier dans Vim et essayez

:set fileformat=unix

Convertissez les fins de ligne eh en fins Unix et voyez si cela résout le problème problème. Si vous éditez dans Vim, entrez la commande suivante: set fileformat = unix et sauvegarder le fichier. Plusieurs autres éditeurs ont la capacité de convertir line des terminaisons, telles que Notepad ++ ou Atom

Merci @lemongrassnginger

5
Jay Killeen

J'ai donc trouvé cet article et les réponses ne m'ont pas aidé, mais j'ai pu comprendre pourquoi cela m'avait causé l'erreur. J'ai eu un

cat > temp.txt < EOF
some content
EOF

Le problème était que j'ai copié le code ci-dessus pour être dans une fonction et que, par inadvertance, on a mis le code en code. Vous devez vous assurer que le dernier EOF n’est pas un onglet. 

5
Rafael Urena

POUR WINDOWS:

Dans mon cas, je travaillais sous Windows et j'ai eu la même erreur en exécutant autoconf.

  • J'ouvre simplement le fichier configure.ac avec mon NOTEPAD ++ IDE.
  • Ensuite, j'ai converti le fichier avec EOL conversion en Windows (CR LF) comme suit:

    EDIT -> EOL CONVERSION -> WINDOWS (CR LF)

1
Juniar

J'ai pu couper et coller votre code dans un fichier et celui-ci a fonctionné correctement. Si vous exécutez comme ceci, cela devrait fonctionner:

Votre "file.sh":

#!/bin/bash
# june 2011

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

La commande:

$ ./file.sh arg1 arg2 arg3

Notez que "file.sh" doit être exécutable:

$ chmod +x file.sh

Vous obtenez peut-être cette erreur b/c de la façon dont vous procédez (avec un tuyau, une carotte, Etc.) Vous pouvez également essayer de scinder la condition en deux:

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

Ou, puisque vous utilisez bash, vous pouvez utiliser la syntaxe intégrée:

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

Et, enfin, vous pourriez bien sûr vérifier si 3 arguments ont été donnés (clean, Maintient la compatibilité POSIX Shell):

if [ $# -ne 3 ]; then
   echo "Error... Usage: $0 Host database username"
   exit 0
fi
1
aaronstacy

Je sais que je suis trop tard pour la fête. J'espère que cela peut aider quelqu'un.

Vérifiez votre fichier .bashrc. Peut-être le renommer ou le déplacer.

Discussion ici: Impossible de créer un script bash simple

0
viggy28

Dans Ubuntu:

$ gedit ~/.profile

Ensuite, File -> Save as et définissez end line sur Unix/Linux

0
Neb

Cela se produisait pour moi lorsque j'essayais d'appeler une fonction à l'aide de parenthèses, par exemple.

run() {
  echo hello
}

run()

devrait être:

run() {
  echo hello
}

run
0
Christian Scott

Je viens de couper et coller votre exemple dans un fichier; il a bien fonctionné sous Bash. Je ne vois pas de problèmes avec ça.

Pour faire bonne mesure, vous voudrez peut-être vous assurer que tout se termine par une nouvelle ligne, même si bash ne devrait pas s'en soucier. (Cela fonctionne pour moi avec et sans la nouvelle ligne finale.)

Vous verrez parfois des erreurs étranges si vous avez accidentellement incorporé un caractère de contrôle dans le fichier. Comme il s'agit d'un script court, essayez de créer un nouveau script en le collant à partir de votre question ici sur StackOverflow ou en le saisissant simplement à nouveau.

Quelle version de bash utilisez-vous? (bash --version)

Bonne chance!

0
Adam Liss

Pour les personnes utilisant MacOS:

Si vous avez reçu un fichier au format Windows et que vous souhaitez exécuter MacOS en voyant cette erreur, exécutez ces commandes.

brew install dos2unix
sh <file.sh>
0
vmorusu

J'ai eu le problème quand j'ai écrit "if-fi" déclaration dans une ligne:

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

Ecrire multiligne a résolu mon problème:

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

0
Sergey

Assurez-vous que le nom du répertoire dans lequel le fichier .sh est présent ne comporte pas de caractère d'espacement. Par exemple: si c'est dans un dossier appelé «Nouveau dossier», vous allez sûrement rencontrer l'erreur que vous avez citée Au lieu de cela, nommez-le simplement 'New_Folder'. J'espère que ça aide.

0
user5770325

Apparemment, certaines versions du shell peuvent également émettre ce message lorsque la dernière ligne de votre script manque de nouvelle ligne.

0
tripleee