这里的文件给出了“意外的文件结束”错误

我需要我的脚本从terminal发送电子邮件。 根据我在这里看到的以及在线其他许多地方,我把它格式化为这样:

/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 

但是,当我运行这个我得到这个警告:

 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 

…其中行x是程序中最后一行代码,行y是其中包含/ var / mail的行。 我尝试用其他东西(ENDOFMESSAGE,FINISH等)replaceEOF,但无济于事。 几乎我在网上find的所有东西都是通过这种方式完成的,而且我真的很新奇,所以我很难自己搞清楚。 任何人都可以提供帮助吗? 谢谢!

EOF标记必须位于行的开头,不能将其与缩进代码块一起缩进。

如果你写<<-EOF你可以缩进它,但它必须用Tab字符缩进,而不是空格。 所以它甚至可能不会以代码块结束。

还要确保在线上的EOF标记之后没有空格。

开始或结束here-doc的行可能有一些不可打印的或空白的字符(例如回车符),这意味着第二个“EOF”与第一个不匹配,并且不会像here-doc一样结束这应该。 这是一个非常常见的错误,很难用文本编辑器来检测。 例如,您可以使不可打印的字符可见cat

 cat -A myfile.sh 

一旦你看到cat -A的输出,解决scheme将是显而易见的:删除有问题的字符。

请尝试删除EOF之前的空格: –

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

使用<tab>而不是<spaces>作为ident并使用<< – EOF工作正常。

"-"删除<tabs> ,而不是<spaces> ,但至less可以工作。

除了Barmar和Joni提到的其他答案之外,我注意到当使用<<-EOF时,我有时必须在EOF之前和之后留下空行。