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 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 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 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. |