Difference between printf and echo in bash

Both echo and printf are built-in commands (printf is Bash built-in since v2.0.2, 1998). echo always exits with a 0 status, and simply prints arguments followed by an end of line character on the standard output, while printf allows for definition of a formatting string and gives a non-zero exit status code upon failure.

printf has more control over the output format. It can be used to specify the field width to use for item, as well as various formatting choices for numbers (such as what output base to use, whether to print an exponent, whether to print a sign, and how many digits to print after the decimal point). This is done by supplying the format string, that controls how and where to print the other arguments and has the same syntax as C language (%03d, %e, %+d,...). This means that you must escape the percent symbol when not talking about format (%%).

Probably, if you add the newline character that echo uses by default (except when using -n option) you'll get the same effect.

printf "blah\n" >/dev/udp/localhost/8125

Concerning performance, I always had in mind that echo was faster than printf because the later has to read the string and format it. But testing them with time (also built-in) the results say otherwise:

$ time for i in {1..999999}; do echo "$i" >/dev/null; done
real    0m10.191s
user    0m4.940s
sys 0m1.710s

$ time for i in {1..999999}; do printf "$i" >/dev/null; done
real    0m9.073s
user    0m4.690s
sys 0m1.310s

Telling printf to add newline characters, just as echo does by default:

$ time for i in {1..999999}; do printf "$i\n" >/dev/null; done
real    0m8.940s
user    0m4.230s
sys 0m1.460s

that is obviously slower than without printing the \n, but yet faster than echo.


The difference is that echo sends a newline at the end of its output. There is no way to "send" an EOF.


Here is probably the best description of echo vs printf

http://www.in-ulm.de/~mascheck/various/echo+printf/

At a very high level.. printf is like echo but more formatting can be done.

Tags:

Bash