fish-shell/doc_src/cmds/printf.rst

98 lines
3.7 KiB
ReStructuredText
Raw Normal View History

.. _cmd-printf:
printf - display text according to a format string
==================================================
Synopsis
--------
::
printf FORMAT [ARGUMENT ...]
Description
-----------
2020-05-19 01:59:45 +08:00
printf uses the format string FORMAT to print the ARGUMENT arguments. This means that it takes format specifiers in the format string and replaces each with an argument.
2020-05-19 01:59:45 +08:00
The ``format`` argument is re-used as many times as necessary to convert all of the given arguments. So ``printf %s\n flounder catfish clownfish shark`` will print four lines.
Unlike :ref:`echo <cmd-echo>`, ``printf`` does not append a new line unless it is specified as part of the string.
2020-05-19 01:59:45 +08:00
It doesn't support any options, so there is no need for a ``--`` separator, which makes it easier to use for arbitrary input than ``echo``. [#]_
2020-05-19 01:59:45 +08:00
Format Specifiers
-----------------
Valid format specifiers are taken from the C library function ``printf(3)``:
2020-05-19 01:59:45 +08:00
- ``%d`` or ``%i``: Argument will be used as decimal integer (signed or unsigned)
- ``%o``: An octal unsigned integer
2020-05-19 01:59:45 +08:00
- ``%u``: An unsigned decimal integer - this means negative numbers will wrap around
- ``%x`` or ``%X``: An unsigned hexadecimal integer
2020-05-19 01:59:45 +08:00
- ``%f``, ``%g`` or ``%G``: A floating-point number. ``%f`` defaults to 6 places after the decimal point (which is locale-dependent - e.g. in de_DE it will be a ``,``). ``%g`` and ``%G`` will trim trailing zeroes and switch to scientific notation (like ``%e``) if the numbers get small or large enough.
- ``%e`` or ``%E``: A floating-point number in scientific (XXXeYY) notation
- ``%s``: A string
- ``%b``: As a string, interpreting backslash escapes, except that octal escapes are of the form \0 or \0ooo.
``%%`` signifies a literal "%".
2020-05-19 01:59:45 +08:00
Conversion can fail, e.g. "102.234" can't losslessly convert to an integer, causing printf to print an error. If you are okay with losing information, silence errors with `2>/dev/null`.
2020-05-19 01:59:45 +08:00
Backslash Escapes
-----------------
printf also knows a number of backslash escapes:
2020-05-19 01:59:45 +08:00
- ``\"`` double quote
- ``\\`` backslash
- ``\a`` alert (bell)
- ``\b`` backspace
- ``\c`` produce no further output
- ``\e`` escape
- ``\f`` form feed
- ``\n`` new line
- ``\r`` carriage return
- ``\t`` horizontal tab
- ``\v`` vertical tab
- ``\ooo`` octal number (ooo is 1 to 3 digits)
- ``\xhh`` hexadecimal number (hhh is 1 to 2 digits)
- ``\uhhhh`` 16-bit Unicode character (hhhh is 4 digits)
- ``\Uhhhhhhhh`` 32-bit Unicode character (hhhhhhhh is 8 digits)
2020-05-19 01:59:45 +08:00
Errors and Return Status
------------------------
If the given argument doesn't work for the given format (like when you try to convert a number like `3.141592` to an integer), printf prints an error, to stderr. printf will then also return non-zero, but will still try to print as much as it can.
It will also return non-zero if no argument at all was given, in which case it will print nothing.
2020-05-19 01:59:45 +08:00
This printf has been imported from the printf in GNU Coreutils version 6.9. If you would like to use a newer version of printf, for example the one shipped with your OS, try ``command printf``.
Example
-------
2018-12-19 11:14:04 +08:00
::
printf '%s\\t%s\\n' flounder fish
Will print "flounder fish" (separated with a tab character), followed by a newline character. This is useful for writing completions, as fish expects completion scripts to output the option followed by the description, separated with a tab character.
2018-12-19 11:14:04 +08:00
::
printf '%s: %d' "Number of bananas in my pocket" 42
2018-12-19 11:14:04 +08:00
Will print "Number of bananas in my pocket: 42", _without_ a newline.
See Also
--------
- the :ref:`echo <cmd-echo>` command, for simpler output
2020-05-19 01:59:45 +08:00
Footnotes
---------
.. [#] (in fact while fish's ``echo`` supports ``--``, POSIX forbids it, so other implementations can't be used if the input contains anything starting with `-`)