Just use --
after printf
to let it know that no more arguments are to come and to consider the string as so:
$ printf -- "-dogs-cats"
-dogs-cats # no new line after this
This is a *NIX-trick that can be used for many other commands. As Bash Reference Manual → 4 Shell Builtin Commands says:
Unless otherwise noted, each builtin command documented as accepting options preceded by ‘-’ accepts ‘--’ to signify the end of the options. The :, true, false, and test builtins do not accept options and do not treat ‘--’ specially. The exit, logout, return, break, continue, let, and shift builtins accept and process arguments beginning with ‘-’ without requiring ‘--’. Other builtins that accept arguments but are not specified as accepting options interpret arguments beginning with ‘-’ as invalid options and require ‘--’ to prevent this interpretation.
Note why this happens:
$ printf "-dogs-cats"
bash: printf: -d: invalid option
printf: usage: printf [-v var] format [arguments]
This makes printf
understand the first part of the string, -d
, as an argument.