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
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
Une autre chose à vérifier (vient de me venir à l'esprit):
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; }
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
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
...
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
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
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.
POUR WINDOWS:
Dans mon cas, je travaillais sous Windows et j'ai eu la même erreur en exécutant autoconf.
Ensuite, j'ai converti le fichier avec EOL conversion en Windows (CR LF) comme suit:
EDIT -> EOL CONVERSION -> WINDOWS (CR LF)
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
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
Dans Ubuntu:
$ gedit ~/.profile
Ensuite, File -> Save as
et définissez end line
sur Unix/Linux
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
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!
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>
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
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.
Apparemment, certaines versions du shell peuvent également émettre ce message lorsque la dernière ligne de votre script manque de nouvelle ligne.