101

ターミナルからメールを送信するにはスクリプトが必要です。ここや他の多くの場所でオンラインで見たものに基づいて、次のようにフォーマットしました。

/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他のもの(ENDOFMESSAGEFINISHなど)に置き換えてみましたが、役に立ちませんでした。私がオンラインで見つけたほとんどすべてがこの方法で行われています。私は bash が初めてなので、自分でそれを理解するのに苦労しています。誰でも助けてもらえますか?

4

8 に答える 8

181

トークンは行の先頭にある必要があります。EOFコードのブロックと一緒にインデントすることはできません。

書く場合はインデントできますが、スペースではなく文字で<<-EOFインデントする必要があります。Tabそのため、コードのブロックでも終わらない可能性があります。

また、行のトークンのに空白がないことを確認してください。EOF

于 2013-09-06T15:10:23.477 に答える
19

ヒアドキュメントを開始または終了する行には、印刷できない文字または空白文字 (改行など) が含まれている可能性があります。これは、2 番目の「EOF」が最初の EOF と一致せず、ヒアドキュメントがそうすべき。これは非常に一般的なエラーであり、テキスト エディタだけでは検出が困難です。catたとえば、次のようにして、印刷できない文字を表示できます。

cat -A myfile.sh

ソリューションからの出力cat -Aが明らかになったら、問題のある文字を削除します。

于 2013-09-06T15:07:53.383 に答える
7

前のスペースを削除してみてくださいEOF:-

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

for ident<tab>の代わりに使用し、 <<-EOF を使用すると問題なく動作します。<spaces>

はではなくを"-"削除しますが、少なくともこれは機能します。<tabs><spaces>

于 2013-09-06T15:06:23.200 に答える