here-document给出'意外的文件结束'错误

thn*_*tls 64 email bash heredoc

我需要我的脚本从终端发送电子邮件.基于我在这里看到的以及许多其他地方的在线,我将它格式化为:

/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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

...其中第x行是程序中最后写入的代码行,第y行是其中的行/var/mail.我试着更换EOF其他的事情(ENDOFMESSAGE,FINISH,等),但无济于事.我在网上找到的几乎所有内容都是这样做的,而且我真的很喜欢bash,所以我很难自己搞清楚.有人可以提供任何帮助吗?

Bar*_*mar 125

EOF令牌必须是在该行的开头,您不能使用的代码它会与块缩进它一起.

如果你写,<<-EOF你可以缩进它,但它必须缩进Tab字符,而不是空格.因此,即使使用代码块,它仍然可能不会结束.

另外,还要确保你有没有空格EOF上线令牌.

  • 在上面的代码示例中,EOF 标记位于行的开头。 (3认同)

Jon*_*oni 12

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

cat -A myfile.sh
Run Code Online (Sandbox Code Playgroud)

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


Rah*_*thi 6

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

/var/mail -s "$SUBJECT" "$EMAIL" <<-EOF
Run Code Online (Sandbox Code Playgroud)

使用<< - EOF <tab>而不是<spaces>用于身份和使用EOF工作正常.

"-"删除<tabs>,不是<spaces>,但至少这个工程.

  • 第一个建议无济于事(您是否测试过空间是否会导致问题?)。仅当 EOF 行用 TAB 缩进而不是空格时,第二个才会有帮助。 (2认同)