Bash printf命令
通常,在编写bash脚本时,我们使用echo打印到标准输出。 echo 是一个简单的命令,但功能有限。要对输出的格式进行更多控制,请使用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\n
是format
,而“ 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
命令采用一种格式和参数,并打印格式化的文本。
如果您有任何问题或反馈,请随时发表评论。