Bash printf Command

Introduction

Before we talk about Bash printf command, let's understand-What is printf Command ?

The printf command in Bash is used for formatted printing. It allows users to print formatted text and variables by specifying various format options. printf is a versatile tool for displaying output in a specific format, controlling the placement of variables, and formatting numerical values, strings, and more.

In this tutorial, you will understand how printf command works. We will also address a few FAQs on Bash printf command.

printf Command

printf is a shell that comes standard with Bash and other popular shells such as Zsh and Ksh. Although there is a separate /usr/bin/printf binary, the built-in version of the shell takes precedence. The built-in version of printf in Bash will be covered.

The printf command has the following syntax:

printf [-v var] format [arguments]

The -v option instructs printf to assign the output to a variable rather than printing it.

The format is a string that can contain one of three object types:

  • Characters that are just printed as-is to the output.
  • Backslash-escaped characters that are interpreted and printed.
  • The values of the relevant arguments that follow the format string replace the conversion specifications that explain the format.

Any number of parameters can be passed to the command. If there are more arguments than format specifiers, the format string is used to consume them all. If there are fewer arguments than format specifiers, the additional numeric-format specifiers are set to zero, while string-format specifiers are set to null.

When using the printf command, there are a few things to keep in mind:

  • Before providing the inputs to the printf command, the shell will substitute any variables, wildcard matches, and special characters.
  • The literal value of each character included within the quotations will be kept when using single quotes. There will be no expansion of variables or commands.
printf "Open issues: %s\nClosed issues: %s\n" "34" "65"
Output

Open issues: 24
Closed issues: 35

The string issues Open: %s\nClosed issues: %s\n is the format while "34" and "65" are arguments. Two newline characters (\n) and two format specifiers (%s) are replaced with the arguments.

At the end of each line, the printf command does not append a newline character (\n).

Backslash-escaped Characters

When used in the format string or an argument corresponding to a %b conversion specifier, backslash-escaped characters are processed. The following is a list of the most frequently used escape characters:

  • \\ - Shows the backslash character.
  • \b - Shows the backspace character.
  • \n - Adds a new line to the document.
  • \r - Represents a carriage return.
  • \t - Displays a horizontal tab.
  • \v - Displays a vertical tab.

Conversion Specifications

The following is an example of a conversion specification:

%[flags][width][.precision]specifier

Each conversion specification begins with a percent sign(%), includes optional modifiers and concludes with one of the letters aAbcdeEfgGioqsuxX, which represents the data type (specifier) of the associated parameter.

Type conversion specifier

The type conversion specifier is a character that determines how the corresponding argument should be interpreted. This character is mandatory and appears after the optional fields.

The following is a list of all type conversions and their functions:

  • %b - Print the argument while expanding backslash escape sequences.
  • %q - Displays the shell-quoted argument, which can be used as input again.
  • %d,%i - Generate a signed decimal integer from the parameter.
  • %u - Display the argument as an unsigned decimal integer.
  • %o - Display the argument as an unsigned octal integer.
  • %x, %X - Print the argument as an unsigned hexadecimal integer with. Lower-case characters are printed by %x, while upper-case letters are printed by %X.
  • %e, %E - Print the argument in exponential notation as a floating-point value. Lower-case letters are printed by  %e, while upper-case letters are printed by %E.
  • % a, %A - Print the argument in hexadecimal fractional notation as a floating-point value. Lower-case letters are printed by %a, whereas upper-case letters are printed by %A.
  • %g, %G - Print the argument as a floating-point number in either normal or exponential notation, depending on the precision and value. Lower-case letters are printed with %g, whereas upper-case letters are printed with %G.
  • %c - Print the argument as a single character.
  • %f - Returns a floating-point number for the argument.
  • %s - As a string, print the argument.
  • %% - A literal percent symbol must be used.

Negative, zero, and positive numbers are represented by an unsigned number, whereas negative, zero, and positive numbers are represented by a signed number.

The following program prints the number 100 in three distinct number systems:

printf "Decimal: %d\nHex: %x\nOctal: %o\n" 100 100 100
Output

Decimal: 100
Hex: 64
Octal: 144

Flags directive

The first optional modifiers are flags, which are used to set the justification, leading zeros, prefixes, and other options.

Here are a few of the most common:

  • - - Within the field, alugn the written text to the left. The text is right-aligned by default.
  • + - Use a + or - sign to prefix the numbers. Only negative numbers are prefixed with a negative sign by default.
  • 0 - Uses leading zeros instead of space to pad numbers.
  • blank - positive numbers should be preceded by a blank space, while negative numbers should be preceded by a minus (-).
  • # - An alternative number format.

Width directive

The width directive, which is filed after any flag characters, defines the minimum amount of characters that should be converted.

The width of the text output is padded with spaces if it is less than the specified width. A non-negative decimal integer or an asterisk (*) can be used to specify the width.

Here's an example:

printf "%20s %d\n" Mark 305

Set the field length to at least 20 characters in %20s. Because the output is right-justified by default, blanks are appended before the text. Use the - flag to align the text to the left (%20s).

Output

Jane 305

When an asterisk (*) is used as a width directive, the conversion field's width is determined by a width argument that comes before the formatted argument.

The width is set to 10 in the example below:

printf "%0*d" 10 5

0 is a flag that causes the integer to be padded with leading zeros rather than blanks. There will be at least 10 characters in the result text:

Output

0000000005

Precision directive

The .precision modifier consists of a dot (.) followed by a positive integer or an asterisk (*) that specifies the number of string or digit characters or decimal places to be written, depending on the specifier type.

The effect of the precision is as follows:

  • The precision sets the minimum number of digits to be printed if the conversion type is an integer. Leading zeros are written if the number of digits in the argument is less than precision.
  • The precision determines the number of digits that follow the decimal-point character if the conversion type is floating-point. The accuracy is set to 6 by default.
  • The precision determines the maximum number of characters to be printed if the conversion type is a string. The surplus characters are trimmed if the number of characters in the argument exceeds precision.

An example of how to round a floating-point number to three decimals is as follows:

printf "%.3f" 1.61803398
Output

1.618

When precision is set to an asterisk (*), the precision argument preceding the formatted argument determines its value.

printf "%.*f" 3 1.61803398
Output

1.618

FAQs on Bash Printf Command

How does printf work in Bash?

printf consists of a format string followed by arguments that match the format specifier placeholders in the format string. It replaces these placeholders with the formatted values of the provided arguments.

What are format specifiers in printf?

Format specifiers in printf are placeholders that define how variables are formatted and displayed. They start with % and are followed by characters that represent the type and format of the variable.

What are some commonly used format specifiers in printf?

Common format specifiers in printf include %s for strings, %d for decimal (integer) values, %f for floating-point numbers, %c for a single character, %x for hexadecimal numbers, and more.

Can printf format and display variables in Bash?

Yes, printf can format and display variables by using format specifiers in the format string and providing variables as arguments that correspond to the placeholders.

How can I align and pad values using printf?

By specifying width and alignment options in the format specifiers, printf can align and pad values. For example, %10s will left-align and pad a string with spaces to a width of 10 characters.

Can I format and display numerical values with custom precision using printf?

Yes, printf allows for custom precision control when formatting numerical values. For example, %0.2f will format a floating-point number with a precision of 2 decimal places and pad with zeros if required.

What is the difference between printf and echo?

Unlike echo, printf provides more control over formatting and output. It allows for precise formatting, handling of escape sequences, and greater flexibility in displaying variables and special characters.

Conclusion

The printf command outputs formatted text after receiving a format and arguments.

If you have any queries, please leave a comment below and we’ll be happy to respond to them.