자세히 조사하면 "구문 오류: 예기치 않은 파일 끝"이 보고됩니다.

자세히 조사하면 "구문 오류: 예기치 않은 파일 끝"이 보고됩니다.

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>

또한 쉘 함수에서 모든 명령을 제거해도 오류가 없습니다.

어떤 오류가 있을 수 있나요?

답변1

<<- EOF연산자를 사용 하는 경우 EOF구분 기호 앞에 탭 문자가 와야 합니다.오직(또는 줄의 시작 부분에) 공백 대신. 구분 기호 로 구성되거나 <space>EOF처리 <space><TAB>EOF되지 않는 줄입니다.

존재하다:

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

<TAB>선행 TAB(위에 표시됨 )은 조회 전에 제거됩니다( 수정 전의 이전 버전을 제외하고 line2다음 물리적 줄에서 계속되는 논리적 줄은 제외).zshEOF

_EOF_따라서 여기서 구분 기호 앞의 모든 공백 문자를 제거해야 합니다 . 아니면 더 나은 방법은 <<-이것을 완전히 피하고 다음을 사용하여 _EOF_줄의 시작 부분에 두는 것입니다.이미 팔로우 중공백으로). 개인적으로 저는 공백의 수에 따라 구문이 달라지는 언어라는 아이디어를 좋아하지 않으며, python그것이 제가 가장 좋아하지 않는 것입니다.

관련 정보