2013-09-06 19 views
26

Potrzebuję mojego skryptu, aby wysłać wiadomość e-mail z terminala. Na podstawie tego, co widziałem tu i wielu innych miejscach w internecie, I sformatowany to tak:tutaj-dokument daje "nieoczekiwany koniec pliku" błąd

/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 

Jednak gdy uruchamiam to mam to ostrzeżenie:

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 

... gdzie linia x jest ostatnią zapisaną linią kodu w programie, a wiersz y jest linią /var/mail. Próbowałem zastąpić EOF z innymi rzeczami (ENDOFMESSAGE, FINISH, itp.), Ale bezskutecznie. Prawie wszystko, co znalazłem online, zrobiło to w ten sposób, a ja jestem naprawdę nowy w bashu, więc trudno mi go wymyślić na własną rękę. Czy ktokolwiek może zaoferować pomoc?

+5

Czy linia 'EOF' jest wcięta? Musi być na początku linii. – Barmar

+0

Jest, ale tylko tak daleko, jak to całe oświadczenie jest zagnieżdżone. Więc musi to być cała droga w lewo? – thnkwthprtls

+2

Upewnij się również, że nie ma znaków końcowych (łącznie z powrotem karetki!) –

Odpowiedz

69

Znacznik EOF musi znajdować się na początku wiersza, nie można wciskać go wraz z blokiem kodu, z którym się wiąże.

Jeśli napiszesz <<-EOF, możesz wprowadzić wcięcie, ale musi być wcięte ze znakami Tab, bez spacji. Więc nadal może nie kończyć się nawet blokiem kodu.

Upewnij się również, że nie ma białego znaku po tokenu EOF na linii.

2

Spróbuj usunąć poprzedzających spacji przed EOF: -

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

Korzystanie <tab> zamiast <spaces> dla Ozn i korzystania < < -EOF działa dobrze.

"-" usuwa <tabs>, a nie <spaces>, ale przynajmniej to działa.

+1

Pierwsza sugestia nie pomoże (czy sprawdziłeś, czy przestrzeń powoduje problem?). Drugi pomoże tylko, jeśli linia EOF jest wcięta z TAB, a nie spacjami. – Barmar

+0

Myślę, że token kończący nie może mieć przedsionków wiodących –

4

Linia, która rozpoczyna lub kończy tutaj-doktor prawdopodobnie zawiera kilka znaków niedrukowalnych lub białych (na przykład powrót karetki), co oznacza, że ​​drugi "EOF" nie pasuje do pierwszego i nie kończy tutaj-doc jak powinien. Jest to bardzo powszechny błąd i trudny do wykrycia za pomocą tylko edytora tekstów. Można dokonać znaki niedrukowalne widoczne na przykład z cat:

cat -A myfile.sh 

Gdy widzisz wyjście z cat -A rozwiązanie będzie oczywista: usunąć znaki obraźliwe.

-2

Wraz z innymi odpowiedziami wspomnianymi przez Barmara i Joni, zauważyłem, że czasami muszę zostawić pustą linię przed i po moim EOF podczas używania <<-EOF.

+0

Nie znajduję żadnego wsparcia w teorii ani praktyce. Schwytanie jako przesąd. – tripleee

Powiązane problemy