здесь-документ дает ошибку "неожиданный конец файла"
мне нужен мой скрипт для отправки электронной почты из терминала. Основываясь на том, что я видел здесь и во многих других местах в Интернете, я отформатировал его следующим образом:
/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
.