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

мне нужен мой скрипт для отправки электронной почты из терминала. Основываясь на том, что я видел здесь и во многих других местах в Интернете, я отформатировал его следующим образом:

/var/mail -s "$SUBJECT" "$EMAIL" << EOF
Here's a line of my message!
And here's 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, etc.), но безрезультатно. Почти все, что я нашел в интернете, сделало это кстати, я действительно Новичок в bash, поэтому мне трудно разобраться в этом самостоятельно. Кто-нибудь может помочь?

4 ответов


на EOF токен должен быть в начале строки, вы не можете отступить его вместе с блоком кода, с которым он идет.

Если вы пишите <<-EOF вы можете отступить, но он должен быть отступ с Tab символы не пробелы. Таким образом, это все еще может не закончиться даже с блоком кода.

также убедитесь, что у вас нет пробелов после the EOF маркер на линии.


строка, которая начинается или заканчивается здесь-doc, вероятно, имеет некоторые непечатаемые или пробелы (например, возврат каретки), что означает, что второй "EOF" не соответствует первому и не заканчивается здесь-doc, как это должно быть. Это очень распространенная ошибка, и ее трудно обнаружить только с помощью текстового редактора. Вы можете сделать непечатаемые символы видимыми, например, с помощью cat:

cat -A myfile.sh

как только вы видите выход из cat -A решение будет очевидным: удалить оскорбительные персонажи.


пожалуйста, попробуйте удалить предшествующие пробелы перед EOF:-

/var/mail -s "$SUBJECT" "$EMAIL" <<-EOF

используя <tab> вместо <spaces> для идента и использования

на "-" снимает <tabs>, а не <spaces>, но по крайней мере это работает.


наряду с другими ответами, упомянутых Barmar и Джони, я заметил, что иногда мне приходится оставлять пустую строку перед и после моего ВФ при использовании <<-EOF.