仔细检查后报告“语法错误:意外的文件结尾”

仔细检查后报告“语法错误:意外的文件结尾”

syntax error: unexpected end of file我在运行以下程序时遇到。

    #! /bin/bash
    # Program to output a system information

    TITLE="System Information Report For $HOSTNAME"
    CURRENT_TIME="$(date +"%x %r %Z")"
    TIMESTAMP="Generated $CURRENT_TIME, by $USER"

    report_uptime () {
        cat <<- _EOF_
            <h2>System Uptime</h2>
            <pre>$(uptime)</pre>
            _EOF_
        return
    }

    report_disk_space () {
        cat <<- _EOF_
            <h2>Disk Space Utilization</h2>
            <pre>$(df -h)</pre>
            _EOF_
        return
    }

    report_home_space () {
        cat <<- _EOF_
            <h2>Home Space Utilization</h2>
            <pre>$(du -sh ~/home/*)</pre>
            _EOF_
        return
    }

    cat << _EOF_
    <HTML>
        <HEAD>
            <TITLE>$TITLE</TITLE>
        </HEAD>
        <BODY>
                <h1>$TITLE</h1>
                <p>$TIMESTAMP</p>
                $(report_uptime)
                $(report_disk_space)
                $(report_home_space)
        </BODY>
    </HTML>
    _EOF_

cat << _EOF我在单独的单元中调试它,从始至终都没有错误

    me at me in ~/desktop
    $ cat << _EOF_
    → <HTML>
    →     <HEAD>
    →         <TITLE>$TITLE</TITLE>
    →     </HEAD>
    →     <BODY>
    →             <h1>$TITLE</h1>
    →             <p>$TIMESTAMP</p>
    →             $(report_uptime)
    →             $(report_disk_space)
    →             $(report_home_space)
    →     </BODY>
    → </HTML>
    → _EOF_
    <HTML>
        <HEAD>
            <TITLE>System Information Report For Max-2018.local</TITLE>
        </HEAD>
        <BODY>
                <h1>System Information Report For Max-2018.local</h1>
                <p>Generated 04/01/2018 02:46:34 PM CST, by me</p>



        </BODY>
    </HTML>

此外,如果我删除 shell 函数中的所有命令,也不会有任何错误。

它可能是什么错误?

答案1

使用<<- EOF运算符时,EOF分隔符前面必须有制表符仅有的(或位于行的开头),而不是空格。由<space>EOF<space><TAB>EOF不被视为分隔符的行。

在:

... <<- EOF
<TAB>line1
<TAB>line2\
<TAB>continued
<TAB>line3
<TAB>EOF

在查找之前,前导 TAB(上面表示为<TAB>)将被删除(除了line2在下一个物理行上继续的逻辑行,在zsh修复之前的旧版本中除外) 。EOF

因此,在这里,您需要删除_EOF_分隔符之前的所有空格字符。或者更好的是,<<-完全避免这种情况,并使用将 the 放在_EOF_行的开头(确保它不是已关注由空格)。就我个人而言,我不喜欢语法取决于空格数量的语言的想法,这python也是我不喜欢的主要事情。

相关内容