The Shell Scripting Tutorial


Newline in Echo: When to use -n, when to use \c

echo: -n or \c

22 Apr 2018

Fortunately, this is becoming less of a problem, but it is worth being aware of, particularly if you are writing scripts for older Unix systems.

When you use the echo statement, a newline is added at the end of the command. That is to say, if your script looks like this:

#!/bin/sh
echo Hello
echo World

Then the output will be:

Hello
World

and not:

HelloWorld

Often, that is exactly what you want, but sometimes you want the echo to not insert that newline automatically.

There is a fix for this ... well, more accurately, there are two fixes for this.

First, you need to be aware that echo is implemented by most shells (as a shell builtin command) and also by the operating system (typically as /bin/echo). So the exact behaviour depends upon what shell you are using, whether it's set to use the builtin echo or the native /bin/echo, and in that situation, you need to know what operating system your script is running on, and how it implements this feature.

Some implementations use echo -n message to tell echo not to append a newline; others don't have -n, so you have to use echo message \c to do the same thing. Most of the time, you will want echo -n, but if you need your script to be fully portable, you need to allow for both:

#!/bin/sh
echo -n "Enter your name: "
read name
echo "Hello, $name"

This will work on some systems, and will look like this:

Enter your name: Steve
Hello, Steve

However, on other systems, it will look like this, which is not ideal:

-n Enter your name: Steve
Hello, Steve

On other systems, you need to write the code like this:

echo "Enter your name: \c"
read name
echo "Hello, $name"

This will provide the right results on those systems, but may give the wrong output on other systems (where \c does not have any special significance, it will be interpreted as a literal c character).

Well, that's a pain. Here's a workaround which will work on both:

if [ "`echo -n`" = "-n" ]; then
  n=""
  c="\c"
else
  n="-n"
  c=""
fi

echo $n "Enter your name: $c"
read name
echo "Hello, $name"

If echo -n wasn't interpreted by echo, it would just display the literal text -n. If so, $n is set to the empty string, and $c is set to \c.

In this instance, the echo $n "Enter your name: $c" command will be parsed as:

echo -n "Enter your name: "

Otherwise, echo did interpret -n as an argument telling it to change its behaviour, so $n is set to -n, and $c is set to the empty string. The echo $n "Enter your name: $c" command will be parsed as:

echo "Enter your name: \c"

Either way, the desired result has been achieved.


My Paperbacks and eBooks

My Shell Scripting books, available in Paperback and eBook formats. This tutorial is more of a general introduction to Shell Scripting, the longer Shell Scripting: Expert Recipes for Linux, Bash and more book covers every aspect of Bash in detail.

Shell Scripting Tutorial

Shell Scripting Tutorial
is this tutorial, in 88-page Paperback and eBook formats. Convenient to read on the go, and in paperback format good to keep by your desk as an ever-present companion.

Also available in PDF form from Gumroad:Get this tutorial as a PDF
Shell Scripting: Expert Recipes for Linux, Bash and more

Shell Scripting: Expert Recipes for Linux, Bash and more
is my 564-page book on Shell Scripting. The first half covers all of the features of the shell in every detail; the second half has real-world shell scripts, organised by topic, along with detailed discussion of each script.