Здесь-документ дает ошибку "неожиданный конец файла"
Мне нужен мой script для отправки электронной почты с терминала. Основываясь на том, что я видел здесь и во многих других местах в Интернете, я отформатировал его так:
/var/mail -s "$SUBJECT" "$EMAIL" << EOF
Here a line of my message!
And here another line!
Last line of the message here!
EOF
Однако, когда я запускаю это, я получаю это предупреждение:
myfile.sh: line x: warning: here-document at line y delimited by end-of-file (wanted 'EOF')
myfile.sh: line x+1: syntax error: unexpected end of file
... где строка x - последняя написанная строка кода в программе, а строка y - это строка с /var/mail
в ней. Я попытался заменить EOF
на другие вещи (ENDOFMESSAGE
, FINISH
и т.д.), Но безрезультатно. Почти все, что я нашел в Интернете, сделал это так, и я действительно новичок в bash, поэтому мне сложно разобраться в этом самостоятельно. Может ли кто-нибудь помочь?
Ответы
Ответ 1
Токен EOF
должен находиться в начале строки, вы не можете сделать отступ вместе с блоком кода, с которым он идет.
Если вы напишите <<-EOF
вы можете сделать отступ, но он должен содержать отступ Tab, а не пробелы. Так что это все еще может не закончиться даже с блоком кода.
Также убедитесь, что после токена EOF
на линии нет пробелов.
Ответ 2
Строка, которая запускает или завершает работу здесь-документа, вероятно, имеет некоторые непечатаемые или пробельные символы (например, возврат каретки), что означает, что второй "EOF" не соответствует первому, и не заканчивается здесь -doc нравится. Это очень распространенная ошибка, и ее трудно обнаружить только с помощью текстового редактора. Вы можете сделать незапечатаемые символы видимыми, например, с помощью cat
:
cat -A myfile.sh
Как только вы увидите результат из cat -A
, решение будет очевидно: удалите оскорбительные символы.
Ответ 3
Попробуйте удалить предыдущие пробелы перед EOF
: -
/var/mail -s "$SUBJECT" "$EMAIL" <<-EOF
Использование <tab>
вместо <spaces>
для идентификатора И с использованием < -EOF отлично работает.
"-"
удаляет <tabs>
, а не <spaces>
, но, по крайней мере, это работает.
Ответ 4
Обратите внимание, что вы также можете получить эту ошибку, если вы сделаете это;
while read line; do
echo $line
done << somefile
Потому что << somefile
должен читать < somefile
в этом случае.
Ответ 5
Наряду с другими ответами, упомянутыми Бармаром и Джони, я заметил, что иногда мне приходится оставлять пустую строку до и после моего EOF при использовании <<-EOF
.