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

Мне нужен мой сценарий для отправки электронного письма от терминала. На основе того, что я видел здесь и много других мест онлайн, я отформатировал его как это:

/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, и т.д.), но напрасно. Почти все, что я нашел онлайн, имеет сделанный этот путь, и я являюсь действительно новым в ударе, таким образом, мне нелегко понимать это самостоятельно. Кто-либо мог предложить какую-либо справку?

62
задан 26 November 2017 в 23:01

5 ответов

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

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

Также удостоверяются, что у Вас нет пробела после EOF маркер на строке.

124
ответ дан 31 October 2019 в 13:36

Обратите внимание, что можно также получить эту ошибку, если Вы делаете это;

while read line; do
  echo $line
done << somefile

, поскольку << somefile должен читать < somefile в этом случае.

1
ответ дан 31 October 2019 в 13:36

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

-3
ответ дан 31 October 2019 в 13:36

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

cat -A myfile.sh

, После того как Вы видите вывод от cat -A, решение будет очевидно: удалите незаконные символы.

12
ответ дан 31 October 2019 в 13:36

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

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

Используя <tab> вместо <spaces> для ident И использующий < <-EOF хорошо работает.

Эти "-" удаляет эти <tabs>, не <spaces>, но по крайней мере это работает.

6
ответ дан 31 October 2019 в 13:36

Другие вопросы по тегам:

Похожие вопросы: