Здесь-документ дает ошибку "неожиданный конец файла"

Мне нужен мой 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.