如何在 shell 函数中创建“此处文档”?

如何在 shell 函数中创建“此处文档”?

我正在读 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

答案2

就我而言,我认为它heredoc在我的 bash 中也不起作用,并且我在 OS X 和 Linux 中都对其进行了测试。

我正在使用VScode,最后我发现问题出在我的制表符设置上。我们应该使用Indent Using Tabs,而不是Indent Using Spaces。在我正确设置后,heredoc带标记的缩进功能<<-一直有效。

vscode 设置

答案3

好的 - 我自己现在正在读同样的书,刚刚完成这个步骤。我也在使用 Mac,但也使用 Ubuntu Virtual Box 来跟随文本。

report_uptime 函数内的 here document 是导致文件意外结束的罪魁祸首。尽管函数的语法如此,但请删除结尾 _EOF_ 前的空格。

为了重现此问题,我将使用以下示例:

here_function_script1

在 shell 读取行首的 _EOF_ 之前,它前面的所有内容都被视为“文本主体”,并且此处的文档永远不会关闭。在这种情况下,它永远不会看到 _EOF_ ,从而导致语法错误。shell 尊重此处文档的语法,而不是函数语法。

here_function_script2

相关内容