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?
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.
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.
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.
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.