关于bash:here-document给出了’意外的文件结尾’错误

here-document gives 'unexpected end of file' error

我需要我的脚本才能从终端发送电子邮件。 根据我在这里和网上许多其他地方看到的内容,我将其格式化为:

1
2
3
4
5
/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

但是,运行此命令时会收到以下警告:

1
2
3
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的行。 我尝试用其他东西(ENDOFMESSAGEFINISH等)替换EOF,但无济于事。 我在网上找到的几乎所有东西都是这样做的,而且我对bash真的很陌生,所以我很难自己搞清楚。 有人可以提供任何帮助吗?


EOF令牌必须在该行的开头,您不能将其与附带的代码块一起缩进。

如果编写<<-EOF,则可以缩进,但必须缩进Tab字符,而不是空格。因此,即使使用代码块,它也可能仍未结束。

此外,请确保该行上EOF标记后没有空格。


开始或结束此处文档的行可能包含一些不可打印或空格字符(例如,回车符),这意味着第二个" EOF"与第一个" EOF"不匹配,并且也不会像这样结束本文这应该。这是一个非常常见的错误,仅使用文本编辑器就很难检测到。您可以使用cat来显示不可打印的字符:

1
cat -A myfile.sh

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


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

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

使用代替进行标识,并使用<<-EOF可以正常工作。

"-"删除了,而不是,但是至少这样做有效。


请注意,如果您执行此操作,也会收到此错误;

1
2
3
while read line; do
  echo $line
done << somefile

因为在这种情况下<< somefile应该读取< somefile


连同Barmar和Joni提到的其他答案,我注意到使用<<-EOF时,有时我在EOF前后必须留一个空白行。