Bash printf 命令

评论 0 浏览 0 2020-06-01

通常,在编写 bash 脚本时,我们使用 echo 来打印到标准输出。 echo 是一个简单的命令,但其功能有限。
要更好地控制输出的格式,请使用printf命令。

printf 命令格式化并打印其参数,类似于 C printf() 函数。

printf命令

printf 是 Bash 和其他流行 shell(如 Zsh 和 Ksh)中的内置 shell。还有一个独立的 /usr/bin/printf 二进制文件,但 shell 内置版本优先。我们将介绍 printf 的 Bash 内置版本。

printf命令的语法如下:

printf [-v var] format [arguments]

-v 选项告诉 printf 不要打印输出,而是将其分配给变量。

format 是一个字符串,可能包含三种不同类型的对象:

  • 正常的字符,只是按原样打印到输出。
  • 反斜杠转义字符被解释然后打印。
  • 描述格式的转换规范,并由格式字符串后面的各个参数的值替换。

该命令接受任意数量的arguments。如果提供的 arguments 多于格式说明符, format会被重新使用,以消耗所有的参数。如果提供的 arguments 少于格式说明符,则额外的数字格式说明符将设置为零值,而字符串格式说明符将设置为空字符串。

以下是向 printf 命令传递参数时需要考虑的几点:

  • shell 将在将参数传递给 printf 命令之前替换所有变量、通配符匹配和特殊字符。
  • 当使用单引号''时,引号内每个字符的字面值将被保留。变量和命令不会扩展。

使用 printf 的典型示例如下:

printf "Open issues: %s\nClosed issues: %s\n" "34" "65"

输出

Open issues: 34
Closed issues: 65

字符串Open issues: %s\nClosed issues: %s\nformat,而“34”和“65”是参数。格式字符串包含两个换行符 (\n) 和两个格式说明符 (%s),它们将替换为参数。

printf 命令不会在行尾添加换行符 (\n)。

反斜杠转义字符

当在格式字符串或与 %b 转换说明符对应的参数中使用反斜杠转义字符时,将解释反斜杠转义字符。以下是最常见的转义字符的列表:

  • \\ - 显示反斜杠字符。
  • \b - 显示退格字符。
  • \n - 显示新行。
  • \r - 显示回车符。
  • \t - 显示水平制表符。
  • \v - 显示垂直制表符。

转换规格

转换规范采用以下形式:

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

每个转换规范都以百分号 (%) 开头,包括可选修饰符,并以以下字母之一结尾,表示相应参数的数据类型 (specifier):aAbcdeEfgGioqsuxX

类型转换说明符

类型转换specifier是一个字符,指定如何解释相应的参数。该字符是必需的,它位于可选字段之后。

下面是显示所有类型转换及其作用的列表:

  • %b - 在展开反斜杠转义序列时打印参数。
  • %q - 打印 shell 引用的参数,可重复用作输入。
  • %d%i - 将参数打印为带符号的十进制整数。
  • %u - 将参数打印为无符号十进制整数。
  • %o - 将参数打印为无符号八进制整数。
  • %x%X - 将参数打印为无符号十六进制整数。 %x 打印小写字母,%X 打印大写字母。
  • %e%E - 将参数打印为指数表示法的浮点数。 %e 打印小写字母,%E 打印大写字母。
  • %a%A - 将参数打印为十六进制小数形式的浮点数。 %a 打印小写字母,%A 打印大写字母。
  • %g%G - 以普通或指数表示法将参数打印为浮点数,以更适合给定值和精度的为准。 %g 打印小写字母,%G 打印大写字母。
  • %c - 将参数打印为单个字符。
  • %f - 将参数打印为浮点数。
  • %s - 将参数打印为字符串。
  • %% - 打印文字 % 符号。

无符号数表示零和正数,而有符号数表示负数、零和正数。

以下命令以三种不同的数字系统打印数字 100:

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

输出

Decimal: 100
Hex: 64
Octal: 144

标志指令

标志是第一个可选修饰符,用于设置对齐方式、前导零、前缀等。

以下是最常见的:

  • - - 字段内的打印文本左对齐。默认情况下,文本右对齐。
  • + - 在数字前加上+- 符号。默认情况下,只有负数才会带有负号前缀。
  • 0 - 用前导零而不是空格填充数字。
  • 空格 - 在正数前添加空格,在负数前添加减号 (-)。
  • # - 替代方案格式 对于数字。

宽度指令

width 指令放置在任何标志字符之后,并指定转换应产生的最小字符数。

如果输出的文本宽度小于指定宽度,则用空格填充。宽度可以指定为非负十进制整数或星号 (*)。

这是一个例子:

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

%20s 表示将字段设置为至少 20 个字符长。在文本之前添加空格是因为默认情况下输出是右对齐的。要将文本左对齐,请使用 - 标志 (%-20s)。

输出

      Mark 305

当星号 (*) 用作 width 指令时,转换字段的宽度由要格式化的参数之前的宽度参数设置。

在下面的示例中,我们将宽度设置为 10:

printf "%0*d" 10 5

0 是一个标志,用前导零而不是空格填充数字。输出文本至少有 10 个字符:

输出

0000000005

精度指令

.precision 修饰符由一个点 (.) 后跟一个正整数或星号 (*) 组成,根据说明符类型,设置要打印的字符串或数字字符数或小数位数。

精度有以下影响:

  • 如果转换类型是整数,则精度指定要打印的最小位数。如果参数中的位数小于精度,则打印前导零。
  • 如果转换类型为浮点数,则精度指定小数点字符后面的位数。默认精度为 6。
  • 如果转换类型是字符串,则精度指定要打印的最大字符数。如果参数中的字符数大于精度,则多余的字符将被截断。

以下示例展示了如何将浮点数四舍五入到小数点后 3 位:

printf "%.3f" 1.61803398

输出

1.618

当精度设置为星号 (*) 时,其值由要格式化的参数之前的精度参数设置。

printf "%.*f" 3 1.61803398

输出

1.618

结论

printf 命令采用格式和参数并打印格式化文本。

如果您有任何问题或反馈,请随时发表评论。

最后更新2023-07-06
0 个评论
标签