Bash printf命令

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

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

printf 命令#

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

的语法 printf 命令如下:

printf [-v var] format [arguments]

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

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

  • 普通字符按原样简单地打印到输出中。
  • 反斜杠转义的字符,这些字符将被解释然后打印。
  • 描述格式的转换规范,并由格式字符串后的各个参数的值代替。

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

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

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

使用的典型例子 printf 好像:

printf "Open issues: %snClosed issues: %sn" "34" "65"
Open issues: 34
Closed issues: 65

字符串 Open issues: %snClosed issues: %sn 是个 format 而“ 34”和“ 65”是自变量。 格式字符串包含两个换行符(n)和两个格式说明符(%s)替换为参数。

printf 命令不添加换行符(n)。

反斜杠转义字符

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

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

转换规格

转换规范采用以下形式:

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

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

类型转换说明符

类型转换 specifier 是指定如何解释相应参数的字符。 该字符是必需的,并且放置在可选字段之后。

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

  • %b -在扩展反斜杠转义序列的同时打印参数。
  • %q -打印用引号引起来的参数,可用作输入。
  • %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: %dnHex: %xnOctal: %on" 100 100 100
Decimal: 100
Hex: 64
Octal: 144

标志指令

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

这是最常见的:

  • - -在字段内左对齐打印的文本。 默认情况下,文本为右对齐。
  • + -在数字前加上数字 + 要么 - 迹象。 默认情况下,仅负数前面带有负号。
  • 0 -用前导零而不是空格填充数字。
  • 空白 -在正数前加上空格,在负数前加上负号(-)。
  • # -数字的另一种格式。

宽度指令

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

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

这是一个例子:

printf "%20s %dn" 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

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

printf "%.*f" 3 1.61803398
1.618

结论#

printf 命令采用格式和参数,并输出格式化的文本。

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

bash终端

Sidebar