Неожиданный конец файла
Может кто-нибудь объяснить, почему конец файла неожиданно в строке 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
Вы сможете увидеть пробелы между символом $
Иногда бывает полезно выяснить какое-то неожиданное поведение.
В этом случае удалите пробелы закончил работу.