124 votes

un document ici donne une erreur de type "fin de fichier inattendue".

J'ai besoin de mon script pour envoyer un email depuis le terminal. Sur la base de ce que j'ai vu ici et à de nombreux autres endroits en ligne, je l'ai formaté comme ceci :

/var/mail -s "$SUBJECT" "$EMAIL" << EOF
Here's a line of my message!
And here's another line!
Last line of the message here!
EOF

Cependant, lorsque je l'exécute, je reçois cet avertissement :

myfile.sh: line x: warning: here-document at line y delimited by end-of-file (wanted 'EOF')

myfile.sh: line x+1: syntax error: unexpected end of file

... où la ligne x est la dernière ligne de code écrite dans le programme, et la ligne y est la ligne avec /var/mail en elle. J'ai essayé de remplacer EOF avec d'autres choses ( ENDOFMESSAGE , FINISH etc.) mais en vain. Presque tout ce que j'ai trouvé en ligne a été fait de cette façon, et je suis vraiment nouveau à bash donc j'ai du mal à le comprendre par moi-même. Quelqu'un peut-il m'aider ?

216voto

Barmar Points 135986

El EOF doit être en début de ligne, vous ne pouvez pas l'indenter en même temps que le bloc de code qui l'accompagne.

Si vous écrivez <<-EOF vous pouvez le mettre en retrait, mais il doit être mis en retrait avec Tab des caractères, pas des espaces. Il se peut donc qu'il n'y ait pas de résultat même avec le bloc de code.

Assurez-vous également que vous n'avez pas d'espaces blancs après el EOF jeton sur la ligne.

22voto

Joni Points 46728

La ligne qui commence ou termine l'here-doc contient probablement des caractères non imprimables ou des caractères d'espacement (par exemple, un retour chariot), ce qui signifie que le deuxième "EOF" ne correspond pas au premier, et ne termine pas l'here-doc comme il le devrait. Il s'agit d'une erreur très courante, difficile à détecter avec un simple éditeur de texte. Vous pouvez rendre visibles les caractères non imprimables, par exemple avec cat :

cat -A myfile.sh

Une fois que vous avez vu la sortie de cat -A la solution sera évidente : supprimer les caractères incriminés.

9voto

Rahul Tripathi Points 1

Essayez d'enlever les espaces précédents avant de EOF :-

/var/mail -s "$SUBJECT" "$EMAIL" <<-EOF

Utilisation de <tab> au lieu de <spaces> pour l'identification et l'utilisation de <<-EOF> fonctionne bien.

El "-" supprime le <tabs> pas <spaces> mais au moins cela fonctionne.

2voto

Roel Points 358

Notez que vous pouvez également obtenir cette erreur si vous faites cela ;

while read line; do
  echo $line
done << somefile

Parce que << somefile devrait lire < somefile dans ce cas.

1voto

Roy Points 1

C'est peut-être vieux, mais j'avais un espace après la fin de EOF. << EOF blah blah EOF <-- c'était le problème. Je l'ai eu pendant des années, j'ai finalement cherché ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X