Preferable and most widely used is not the same thing. While
printf is better for many reasons, most people still use
echo because the syntax is simpler.
The main reasons why you should prefer
echo is not standardized, it will behave differently on different systems.
It is hard to predict what you're actually running when you
echo foo. To illustrate, on my Debian system:
$ type -a echo
echo is a shell builtin
echo is /bin/echo
As you can see, there are two different
echo commands, one is a shell (bash in this case) builtin and another is a separate binary. Note that
bash also has a
printf builtin but its behavior is more standardized so it is less of an issue (thanks to @ RaduRădeanu for pointing it out).
Since some (but not all) implementations of
echo support command line switches, it is hard to print a string that starts with a
-. While many programs support
-- to signify the end of switches and the beginning of arguments (for example,
grep -- -a file will find lines in
file that contain
echo does not. So, how do you have
$ echo -n ## no output
$ echo '-n' ## no output
$ echo "-n" ## no output
$ echo \-n ## no output
$ echo -e '\055n' ## using the ASCII code works but only on implementations
-n ## that support -e
printf can do this easily:
$ printf -- '-n\n'
$ printf '%s\n' -n
$ printf '\055n\n'
For more information than you ever wanted to know on why
printf is better than
echo, see this answer to a similar question on http://unix.stackexchange.com: