web-dev-qa-db-fra.com

here-document donne l'erreur 'fin de fichier inattendue'

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

/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 lance ceci, 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 du programme et la ligne y est la ligne avec /var/mail dedans. J'ai essayé de remplacer EOF par d'autres éléments (ENDOFMESSAGE, FINISH, etc.), mais en vain. Presque tout ce que j'ai trouvé en ligne l'a fait de cette façon, et comme je suis vraiment nouveau à Bash, j'ai du mal à me débrouiller seul. Quelqu'un pourrait-il offrir de l'aide?

57
thnkwthprtls

Le jeton EOF doit être au début de la ligne, vous ne pouvez pas l'indenter avec le bloc de code associé.

Si vous écrivez <<-EOF vous pouvez le mettre en retrait, mais il doit être mis en retrait avec Tab des personnages, pas des espaces. Donc, il pourrait toujours ne pas finir même avec le bloc de code.

Assurez-vous également que vous n'avez aucun espace après le jeton EOF sur la ligne.

120
Barmar

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

cat -A myfile.sh

Une fois que vous voyez le résultat de cat -A la solution sera évidente: supprimez les caractères incriminés.

10
Joni

Essayez de supprimer les espaces précédents avant EOF: -

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

En utilisant <tab> au lieu de <spaces> pour ident ET avec << - EOF fonctionne bien.

Le "-" supprime le <tabs>, ne pas <spaces>, mais au moins ça marche.

5
Rahul Tripathi

Notez que l’on peut également obtenir cette erreur si vous le faites.

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

Car << somefile Devrais lire < somefile dans ce cas.

0
Roel Van de Paar