myfreax

Bash printf命令

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

6 min read
By myfreax
Bash printf命令

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

printf命令

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

printf命令的语法如下:

printf [-v var] format [arguments]

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

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

  • 仅按原样打印到输出中的普通字符。
  • 反斜杠转义的字符将被解释然后打印。
  • 转换说明,描述了格式,并且替换格式字符串后的各个参数的值。

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

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

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

使用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 -打印带引号的参数,可重复使用作为输入。
  • %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 -用前导零而不是空格填充数字。
  • 空白 - Prefix the positive numbers with a blank space and negative numbers with a minus (-)。
  • # -数字的替代格式

Width指令

width指令放置在任何标记字符之后,并指定转换最小字符数。

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

以下是示例:

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

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

      Mark 305

如果将星号(*)用作width指令,则转换字段的width由要格式化的参数之前的width参数设置。

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

printf "%0*d" 10 5

0是一个标志,用于在数字前加零而不是空格。 输出文本将至少包含10个字符:

0000000005

Precision指令

.precision修饰符由一个点(.)和一个正整数或星号(*)组成,根据指定符的类型,该字符串设置数字或数字字符的数量或小数位数 待打印。

Precision具有以下作用:

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

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

printf "%.3f" 1.61803398
1.618

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

printf "%.*f" 3 1.61803398
1.618

结论

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

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