'erro de sintaxe: final inesperado do arquivo' reportado após ser cuidadosamente verificado

0

Encontro syntax error: unexpected end of file durante a execução do programa a seguir.

    #! /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_

Eu depuro em unidades separadas, não há bugs de cat << _EOF até o final

    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>

Além disso, também não há bugs se eu eliminar todos os comandos nas funções do shell.

Qual é o problema?

    
por JawSaw 01.04.2018 / 09:13

1 resposta

2

Quando você usa o operador <<- EOF , o delimitador EOF deve ser precedido por TABs somente (ou estar no início da linha), não em espaços. Uma linha que consiste em <space>EOF ou <space><TAB>EOF não é vista como delimitador.

Em:

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

As principais TABs (acima representadas como <TAB> ) são removidas (exceto a linha lógica line2 continuada nas próximas linhas físicas, exceto em versões antigas de zsh antes de ser corrigida) antes da EOF é procurado.

Então, você precisaria remover todos os caracteres de espaço antes do delimitador _EOF_ . Ou melhor, evite <<- e use o _EOF_ no início da linha (certificando-se de que não seja seguido por espaços em branco). Pessoalmente, eu não gosto da ideia de uma linguagem onde a sintaxe depende da quantidade de espaços, essa é a principal coisa que eu também não gosto em python .

    
por 01.04.2018 / 10:57

Tags