39

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
48

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.

|improve this answer|||||
25

-- 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' '-----------------------'
|improve this answer|||||
  • what about when you need to do this with a sequence? printf '-%.0s' {1..54} – qodeninja Aug 18 '19 at 18:42
  • 2
    @qodeninja Then you actually do want to use -- :-) printf -- '-%.0s' {1..54} – Chris Down Aug 19 '19 at 14:33
4

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
|improve this answer|||||

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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