## 28.13. Here Document Example #1: Unformatted Form Letters

`<<`Section 27.16

The here document operator `<<` (Section 27.16) is often used in shell scripts -- but it's also handy at a shell prompt, especially with zsh multiline editing or a throwaway script. But you also can just type it in at a Bourne shell prompt (Section 28.12). (If you use csh or tcsh, you can either use a foreach loop (Section 28.9) or start a subshell (Section 24.4).)

The example below shows a for loop (Section 28.9) that prints three friendly form letters with the lpr (Section 45.2) command. Each letter has a different person's name and the current date at the top. Each line of the loop body starts with a TAB character, which the `<<-` operator removes before the printer gets the text:

>     for person in "Mary Smith" "Doug Jones" "Alison Eddy"
>     do
>        lpr <<- ENDMSG

>        `date`

>        Dear $person,

>        This is your last notice. Buy me pizza tonight or
>        else I'll type "rm -r *" when you're not looking.

>        This is not a joak.

>        Signed,
>        The midnight skulker
>        ENDMSG
>     done

The shell reads the standard input until it finds the terminator word, which in this case is `ENDMSG`. The word `ENDMSG` has to be on a line all by itself. (Some Bourne shells don't have the `<<-` operator to remove leading TAB characters. In that case, use `<<` and don't indent the loop body.) The backquotes (Section 28.14) run the date command and output its date; `$person` is replaced with the person's name set at the top of the loop. The rest of the text is copied as is to the standard input of the lpr command.

-- JP

Copyright © 2003 O'Reilly & Associates. All rights reserved.