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
c="\c"
n="-n"
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.
|