[Chapter 8] 8.6 Output Command-Line Arguments
Author: Jerry Peek, Tim O'Reilly & Mike Loukides
Date: 1998-08-04T21:34:14Z

#

| Chapter 8 How the Shell Interprets What You Type |

## 8.6 Output Command-Line Arguments

The echo command writes its command-line arguments and a newline to the standard output. Shell scripts use echo for sending text to the terminal, down a pipe, and into a file. You can use echo on the command line to show the value of a variable (6.1, 6.8), to see how filename wildcards will expand without doing anything else to those files, or to check quoting (46.2):

>     % echo "USER is $USER."
>     USER is jerry.
>     % echo "All 'a' files are:    " a*
>     All 'a' files are:     abacus apple axes

The printf command gives you more formatting control.

### 8.6.1 Portability

The C shell and most other newer shells have a version of echo that's built in (1.10) so it's faster.

The original echo, and the csh echo which acts like it, have just one option. The -n option tells echo not to print a newline after the message. Shell scripts use -n to send a question to a user and leave the cursor at the end of the message:

>     echo -n "Enter your name: "

(The space at the end makes the prompt look better. The quotes make the shell pass that space on to echo.)

Newer versions of echo check their arguments for a backslash (`\`). This marks the start of an escape sequence, a character that the backslash and the next letter stand for. For example, when these newer echos see `\n`, they print a newline character:

>     $ echo "1.\n2.\n3."
>     1.
>     2.
>     3.
>     $

In this version of echo, a `\c` at the end of the last argument suppresses the newline - like the -n option does in the other echo:

>     echo "Enter your name: \c"

Your online echo (or csh) manual page should tell you which version you have and list any escape sequences.

The problem with this newer echo is that it's tough to echo an arbitrary string that might have a backslash in it. Chris Torek has a workaround: use a here-document (8.18) and cat (25.2) instead of echo. For example:

>     cat << END
>     The answer is: $variable-whose-value-might-contain-backslashes
>     END

bash users are lucky: That shell's echo has a -e option that enables backslash interpretation, and a -E option that disables it.

printf | Another utility called printf works like the printf(3) routine in the C language; it handles escape sequences, lets you set field widths, and more. (The GNU version is on the CD-ROM.) Here's an example. The wc command gives the number of lines, words, and characters in a file, followed by the filename. We pass those four fields in the wc output to the printf command line with backquotes (9.16). (If you need a reminder of wc's output, see article 29.6.) printf takes a formatting command from its first argument. It outputs the fourth argument after that (`%4$s`, the filename); the number of words from the second argument, in a field five wide with leading zeroes (`%2$05s`); and the number of lines from the first argument (`%1$s`); with a newline (`\n`) to finish the line:

>     $ printf 'The %4$s file has %2$05s words on %1$s lines.\n' `wc count`
>     The count file has 00235 words on 42 lines.

Because printf isn't built into any shells I know of, it's more portable than the crazy set of echos. If we had printf and the old echo, life would be easier. Article 46.10 shows a way to make echo portable.

The C shell echo works differently from other versions. For example, to make an empty line with the standard echo, don't give any arguments. (This is usually done for readability - to put blank lines between other output.) Standard echo will just print a newline:

>     $ echo

>     $

Without arguments, the C shell echo doesn't print the newline. To get a newline, you have to give an empty argument:

>     % echo ""

>     %

To use the standard echo from the C shell, type /bin/echo instead.

### 8.6.2 Making Error Messages

echo writes to standard output. Error messages in shell scripts should be written to the standard error so that redirection (13.1) of standard output doesn't accidentally capture the message. The Bourne shell `1>&2` operator (45.21) will move echo's output to standard error:

>     echo "progname: choke wheeze complain" 1>&2

The C shell can't do that - which is another reason not to write shell scripts with csh (47.2).

- JP

8.5 Command-Line Evaluation |  | 8.7 Setting Your Search Path