Неожиданный конец файла

Может кто-нибудь объяснить, почему конец файла неожиданно в строке 49? (Строка 49 - одна строка после последней строки)

#!/bin/bash 

timeend=$(date -u +%H%M)
timestart=$(date --date "$timeend 30 minutes ago" -u +%H%M)
firsttime=0

while true
do
    if [[ $firsttime -eq 0 ]]; then
    time=$timestart
    increment=0
    fi
    if [[ $firsttime -ne true ]]; then
    increment=$(( $increment + 2 ))
    time=$(( $timestart + $increment ))
    fi
    if [[ $time -ge $timeend ]]; then
    break
    fi 

    gpnids << EOF
    RADFIL   = NEXRIII|CLT|TR0
    RADTIM   = "$time"
    TITLE    = 1/-2
    PANEL    = 0
    DEVICE   = gif|radar"$increment".gif|1280;1024|C
    CLEAR    = Y
    TEXT     = 1/2/2/hw
    COLORS   = 7
    WIND     =  
    LINE     =  
    CLRBAR   =  
    IMCBAR   = 5/v/LL/.005;.6/.4;.01
    GAREA    = dset
    MAP      = 24 + 23 + 1/1/2 + 14 + 15/1/2
    LATLON   = 0
    OUTPUT   = t

    $mapfil = lorvus.usg + hicnus.nws + hipona.nws + louhus.nws + loisus.nws
    run

    exit
    EOF
    firsttime=1

    gpend

 done

4 ответа

Решение

Вы также должны были получить еще одну ошибку, которая может быть более информативной:

/home/terdon/scripts/b.sh: строка 49: предупреждение: здесь-документ в строке 21, разделенный концом файла (требуется `EOF ')

/home/terdon/scripts/b.sh: строка 50: синтаксическая ошибка: неожиданный конец файла

Ваша ошибка в том, что перед строкой, заканчивающей heredoc, есть пробелы. Чтобы взять простой пример, это жалуется:

#!/bin/bash 

cat << EOF
   hello
   EOF

Но это не так:

#!/bin/bash 

cat << EOF
   hello
EOF

Я получил две строки, которые должны помочь вам разобраться, что происходит:

./test: line 48: warning: here-document at line 21 delimited by end-of-file (wanted `EOF')
./test: line 49: syntax error: unexpected end of file

Ваш heredoc (<< EOF) конструкция построена неправильно. Он чувствителен к пробелам, поэтому вы можете либо убрать его обратно:

...
    command <<EOF
        ...
EOF

Или дайте ему знать, что вы вкладываете его (и это должна быть вкладка):

...
    command <<-EOF
        ...
    EOF

Я предпочитаю второе, потому что оно позволяет вам структурировать сценарий намного лучше... Что-то, от чего ваш сценарий уже может извлечь выгоду.

Предупреждение об окончании файла

%>: строка 49: предупреждение: здесь-документ в строке 21, разделенный концом файла (требуется 'EOF')

  • heredoc ищет разделитель (конечный тег), в данном случае EOF
  • он никогда не распознается в вашем примере, потому что он начинается с пробела
  • конец фактического файла достигается без поиска разделителя; отсюда и предупреждение

Эту проблему можно решить, удалив пробелы, или, как Терндон указывает на использование вкладок - я этого не знал


Другой

Другая распространенная ошибка, связанная с ошибкой конца файла, связана с проблемами пробелов. Обычно от копирования онлайн-кода, отформатированного для Windows, и запуска его в Linux.

Это можно решить, запустив dos2unix в файле, чтобы быстро конвертировать эти символы.

Если вы используете vim или vi, попробуйте использовать команду

:set list

Вы сможете увидеть пробелы между символом $

Иногда бывает полезно выяснить какое-то неожиданное поведение.
В этом случае удалите пробелы закончил работу.

Другие вопросы по тегам