Bash printf 命令
通常,在编写 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\n
是format
,而“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
命令采用格式和参数并打印格式化文本。
如果您有任何问题或反馈,请随时发表评论。