I'm trying to use printf to format some pretty output in a bash script

e.g.:
-----------------------
| This is some output |
-----------------------

But I've stumbled over some behavior I don't understand.

$ printf "--" gives me the error printf: usage: printf [-v var] format [arguments]

and $ printf "-stuff" results in -bash: printf: -s: invalid option

So apparently printf thinks I'm trying to pass some arguments while I'm not.

Meanwhile, completely by accident, I've found this workaround:
$ printf -- "--- this works now ----\n" gives me --- this works now ----

Can anyone explain this behavior?

  • 1
    See also unix.stackexchange.com/questions/11376/… – manatwork Oct 17 '11 at 11:51
  • Out of intereset, are there any implementations of echo that would fail when doing echo ------------? Most only support -n (no trailing newline), -e (interpret backslash-escaped chars) and possible -E (do NOT interpret them) and do not error out when other option-like arguments are encountered, right? (EDIT: GNU's /bin/echo also supports --help and --version.) – janmoesen Oct 18 '11 at 6:34
up vote 35 down vote accepted

The -- is used to tell the program that whatever follows should not be interpreted as a command line option to printf.

Edit: Thus the printf "--" you tried basically ended up as "printf with no arguments" and therefore failed.

  • 13
    In other words, to print -- you can run printf -- --. – l0b0 Oct 17 '11 at 12:14
  • 2
    ... and printf -- is the same as printf (you get the same message) – Peter.O Oct 17 '11 at 14:54
  • Just a technicality, but you mean shouldn't be interpreted as an option, not an argument. – Chris Down Nov 7 '11 at 13:06
  • Yes, right, thanks. Edited. – sr_ Nov 7 '11 at 13:24

-- is being interpreted as an option (in this case, to signify that there are no more options).

A format string should always be included when using printf to prevent bad interpretation. For your particular case:

printf '%s\n' '-----------------------'

There are differences between printf builtin and /usr/bin/printf, the second one do "what you mean" without these annoying errors.

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.