Réponses:
Je pense que file.sh est avec des 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 m'arriver):
C'est-à-dire que cet extrait de code innocent provoquera la même erreur:
die () { test -n "$@" && echo "$@"; exit 1 }
Pour rendre l'analyseur muet heureux:
die () { test -n "$@" && echo "$@"; exit 1; }
;
instruction Every doit se terminer par de ;
sorte que, à la fin, par exemple: if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
produira cette erreur, alors que if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;
ne remarquera pas les petits points-virgules à la fin, c'est-à-dire: après .bash
et fi
.
zsh
utilisateur. Le premier fonctionne dans zsh
mais pas dans sh
ni bash
. J'aimerais être 4 personnes pour pouvoir donner 4 votes positifs
Je viens également de recevoir ce message d'erreur en utilisant la mauvaise syntaxe dans une if
clause
else if
(erreur de syntaxe: fin de fichier inattendue) elif
(syntaxe correcte)Je l'ai débogué en commentant des bits jusqu'à ce que cela fonctionne
une clause if => fi non fermée le soulèvera également
astuce: utilisez trap pour déboguer, si votre script est énorme ...
par exemple
set -x
trap read debug
unexpected end of file
erreur se produira dès que le fi
est frappé.
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. Si vous modifiez dans Vim, entrez la commande: set fileformat = unix et enregistrez le fichier. Plusieurs autres éditeurs ont la possibilité de convertir les fins de ligne, comme Notepad ++ ou Atom
Merci @lemongrassnginger
dos2unix
que la réponse acceptée conseille.
J'ai donc trouvé cet article et les réponses ne m'ont pas aidé, mais j'ai pu comprendre pourquoi cela m'a donné l'erreur. J'ai eu un
cat > temp.txt < EOF
some content
EOF
Le problème était que j'avais copié le code ci-dessus pour être dans une fonction et que j'avais par inadvertance tabulé le code. Il faut s'assurer que le dernier EOF n'est pas tabulé.
EOF
retrait de quatre espaces et bash ne l'avait pas analysé à cause de cela. La suppression des espaces a résolu le problème.
Cela se passait pour moi lorsque j'essayais d'appeler une fonction en utilisant des parens, par exemple
run() {
echo hello
}
run()
devrait être:
run() {
echo hello
}
run
POUR LES FENÊTRES:
Dans mon cas, je travaillais sur le système d'exploitation Windows et j'ai eu la même erreur lors de l'exécution d'autoconf.
Ensuite, j'ai converti le fichier avec la conversion EOL en Windows (CR LF) comme suit:
EDIT -> CONVERSION EOL -> WINDOWS (CR LF)
J'ai pu couper et coller votre code dans un fichier et il a fonctionné correctement. Si vous l'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 en raison de la façon dont vous effectuez les entrées (avec un tuyau, une carotte, etc.). Vous pouvez également essayer de diviser 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 pouvez bien sûr simplement vérifier si 3 arguments ont été donnés (nettoyer, maintient la compatibilité du shell POSIX):
if [ $# -ne 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Je viens de copier-coller votre exemple dans un fichier; il a bien fonctionné sous bash. Je n'y vois aucun problème.
Pour faire bonne mesure, vous voudrez peut-être vous assurer qu'il se termine par une nouvelle ligne, bien que bash ne devrait pas s'en soucier. (Il fonctionne pour moi à la fois avec et sans la dernière ligne.)
Vous verrez parfois des erreurs étranges si vous avez accidentellement incorporé un caractère de contrôle dans le fichier. Puisqu'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 retapant simplement.
Quelle version de bash utilisez-vous? ( bash --version
)
Bonne chance!
Assurez-vous que le nom du répertoire dans lequel se trouve le fichier .sh ne comporte pas de caractère espace. Par exemple: dites que si c'est dans un dossier appelé «Nouveau dossier», vous êtes obligé de rencontrer l'erreur que vous avez citée. Au lieu de cela, nommez-le simplement «New_Folder». J'espère que ça aide.
Je sais que je suis trop tard à 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 trouver un script bash simple
Manquer une accolade fermante sur une définition de fonction provoquera cette erreur comme je viens de le découvrir.
function whoIsAnIidiot() {
echo "you are for forgetting the closing brace just below this line !"
Ce qui bien sûr devrait être comme ça ...
function whoIsAnIidiot() {
echo "not you for sure"
}
Dans mon cas, il y a un redondant \
dans ce qui suit:
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
}
Il n'y a pas un \
à la fin deDATA.PATH_PREFIX ./afs/kinetics400