Aquí el documento muestra un error de “fin de archivo inesperado”

Necesito mi script para enviar un correo electrónico desde la terminal. Basado en lo que he visto aquí y en muchos otros lugares en línea, lo formateé así:

/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 

Sin embargo, cuando ejecuto esto recibo esta advertencia:

 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 

… donde la línea x es la última línea de código escrita en el progtwig, y ​​la línea y es la línea con /var/mail en ella. He intentado reemplazar EOF con otras cosas ( ENDOFMESSAGE , FINISH , etc.) pero fue en vano. Casi todo lo que he encontrado en línea lo ha hecho de esta manera, y soy realmente nuevo en bash, así que estoy teniendo dificultades para descubrirlo por mi cuenta. ¿Alguien podría ofrecer alguna ayuda?

El token de EOF debe estar al principio de la línea, no puede sangrarlo junto con el bloque de código con el que va.

Si escribe <<-EOF , puede aplicar sangría, pero debe sangrar con caracteres de tabulación , no espacios. Por lo tanto, podría no terminar incluso con el bloque de código.

También asegúrese de no tener espacios en blanco después de la ficha EOF en la línea.

La línea que inicia o termina el here-doc probablemente tenga algunos caracteres no imprimibles o espacios en blanco (por ejemplo, retorno de carro), lo que significa que el segundo “EOF” no coincide con el primero y no termina con el here-doc. debería. Este es un error muy común y difícil de detectar con solo un editor de texto. Puede hacer que los caracteres no imprimibles sean visibles, por ejemplo, con cat :

 cat -A myfile.sh 

Una vez que vea el resultado del cat -A la solución será obvia: eliminar los caracteres ofensivos.

Intente eliminar los espacios precedentes antes de EOF : –

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

Usar lugar de para ident AND usando << - EOF funciona bien.

El "-" elimina las , no , pero al menos esto funciona.

Junto con las otras respuestas mencionadas por Barmar y Joni, he notado que a veces tengo que dejar una línea en blanco antes y después de mi EOF cuando uso <<-EOF .