我正在读 William Shotts Jr. 的伟大Linux 命令行在我的 Mac OSX 10.7.5 系统上。 Shotts 所介绍的 90% 的 Linux 与 Darwin 非常接近,我可以弄清楚或使用 GTEM 弄清楚发生了什么。我已经读到第 27 章“编写 Shell 脚本”,但无法在函数中创建“此处文件”。
syntax error: unexpected end of file
当我包含以下函数时出现错误:
report_uptime () {
cat <<- _EOF_
<H2>System Uptime</H2>
<PRE>$(uptime)</PRE>
_EOF_
return
}
如果我使用以下函数占位符,错误就会消失:
report_uptime () {
return
}
另外,在脚本的其他地方,在函数之外,我使用格式cat << _EOF_
毫无问题地创建了“此处文件”:
cat << _EOF_
<HTML>
<HEAD>
<TITLE>$TITLE</TITLE>
</HEAD>
<BODY>
<H1>$TITLE</H1>
<P>$TIME_STAMP</P>
$(report_uptime)
$(report_disk_space)
$(report_home_space)
</BODY>
</HTML>
_EOF_
如果有人知道我做错了什么,我将不胜感激!
答案1
如果重定向运算符是“<<-”,则所有前导制表符都会从输入行和包含分隔符的行中删除。这允许 shell 脚本中的 here-documents 以自然方式缩进。
如果这不起作用,请尝试移动末梢血标记到行的最开始(删除所有空格)。
答案2
就我而言,我认为它heredoc
在我的 bash 中也不起作用,并且我在 OS X 和 Linux 中都对其进行了测试。
我正在使用VScode
,最后我发现问题出在我的制表符设置上。我们应该使用Indent Using Tabs
,而不是Indent Using Spaces
。在我正确设置后,heredoc
带标记的缩进功能<<-
一直有效。
答案3
好的 - 我自己现在正在读同样的书,刚刚完成这个步骤。我也在使用 Mac,但也使用 Ubuntu Virtual Box 来跟随文本。
report_uptime 函数内的 here document 是导致文件意外结束的罪魁祸首。尽管函数的语法如此,但请删除结尾 _EOF_ 前的空格。
为了重现此问题,我将使用以下示例:
在 shell 读取行首的 _EOF_ 之前,它前面的所有内容都被视为“文本主体”,并且此处的文档永远不会关闭。在这种情况下,它永远不会看到 _EOF_ ,从而导致语法错误。shell 尊重此处文档的语法,而不是函数语法。