Skip to content
Vidar Holen edited this page Oct 17, 2018 · 9 revisions

Don't use variables in the printf format string. Use printf "..%s.." "$foo".

Problematic code:

printf "Hello, $NAME\n"

Correct code:

printf "Hello, %s\n" "$NAME"

Rationale:

printf interprets escape sequences and format specifiers in the format string. If variables are included, any escape sequences or format specifiers in the data will be interpreted too, when you most likely wanted to treat it as data. Example:

coverage='96%'
printf "Unit test coverage: %s\n" "$coverage"
printf "Unit test coverage: $coverage\n"

The first printf writes Unit test coverage: 96%.

The second writes bash: printf: `\': invalid format character

Exceptions

Sometimes you may actually want to interpret data as a format string, like in:

octToAscii() { printf "\\$1"; }
octToAscii 130

In Bash, Ksh and BusyBox, there's a %b format specifier that expands escape sequences without interpreting other format specifiers: printf '%b' "\\$1". In POSIX, you can instead ignore this warning.

Other times, you might have a pattern in a variable:

filepattern="file-%d.jpg"
printf -v filename "$filepattern" "$number"

This has no good rewrite. Please ignore the warning with a directive.

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally