Bash函数中使用Here Document遇意外EOF错误的排查咨询
错误原因及解决办法
错误原因
问题核心出在Here Document的终止符格式上:
- 你使用
<<- _EOF_时,这种写法仅允许终止符_EOF_前有制表符(Tab键)缩进,绝对不能用空格缩进; - 你的脚本里,函数内的
_EOF_前应该是加了空格,导致bash无法识别这个终止符,它会把后续的return、}都当成Here Document的内容,直到文件结束都找不到函数的闭合},因此抛出Syntax error: end of file unexpected (expecting "}")。 - 就算换成
<< EOF,终止符也必须是该行唯一内容,不能有任何前导空格或制表符,否则同样会触发类似问题。
解决办法
有两种可行的修正方式:
方式1:让终止符顶格书写
直接把函数内的_EOF_改成顶格,不要加任何空格或制表符,修改后的函数代码如下:
report_home_space () { cat <<- _EOF_ <h2>Home Space Utilization</h2> <pre>$(du -sh /home/*)</pre> _EOF_ # 这里必须顶格,无任何前导空白 return }
方式2:用制表符缩进终止符(仅适配<<-写法)
如果想保留代码的缩进可读性,确保_EOF_前面的缩进是**制表符(Tab键)**而非空格,示例代码:
report_home_space () { cat <<- _EOF_ <h2>Home Space Utilization</h2> <pre>$(du -sh /home/*)</pre> _EOF_ # 这里的缩进是Tab键,不是空格 return }
另外补充:脚本里的* other html here *在Here Document中不会被bash解析,若要添加注释,需在Here Document外部使用#,不过这部分不影响当前报错。
内容的提问来源于stack exchange,提问作者Ajeje
相关产品推荐
相关产品推荐

