本文最先发布在:https://cloud.tencent.com/developer/article/1638884
通常,在写 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
是一个字符串,包含三种不同的对象:
这个命令接受无限数量的参数。如果参数比格式中的多,那么format
将会重复使用,来匹配所有的参数。如果参数比格式中的少,那么数字格式的参数被设置为0,字符串格式的参数将被设置为了空字符串。
下面是传递参数给printf
命令一些需要注意的点:
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
)。
转义字符放在格式化字符串或者参数中将会被解释,类似于%b
转换符。这里是一些常用的转义字符:
\\
- 显示一个反斜杠符号\b
- 显示一个后退字符\n
- 显示一个换行符\r
- 显示一个回车符\t
- 显示一个横向制表符\v
- 显示一个竖向制表符一个转换规格如下:
%[flags][width][.precision]specifier
每一个转换规格以%
开头,包含一个可选的修饰符并且以下面的字符结尾aAbcdeEfgGioqsuxX
。
类型转换符是一个用来和参数进行对应的字符。这个字符是必须的,并且在可选的文本域后面。
下面是一个列表,显示各种类型转换符,以及他们的作用:
符号指令是可选修饰符,被用来调整,补0,等等。
下面是通用情况:
-
- 左对齐文本。默认情况下,文本是右对齐的。+
- 在数字前面添加+
或者-
号。默认情况下,仅仅负数前面加上-
号。0
- 空白处补0#
- 数字格式width
指令被放置在任何符号字母的前面,用来指定转换结果的宽度。
如果输出结果宽度小于指定宽度,补充空格。宽度可以被指定为一个非负数或者一个星号(*)
这里是一个例子:
printf "%20s %d\n" Mark 305
%20s
意思是设置至少20个字母长度。在文本前面放置空白,因为默认输出是右对齐的。想要文本左对齐,使用-
符号(%-20s
)。
Mark 305
当宽度使用星号(*)的时候,字符宽度由后面具体提供的参数决定。
在下面的这个例子中,宽度被设置成10:
printf "%0*d" 10 5
0
是一个标记,意思是补0,而不是补空格。输出文本至少10个字符:
0000000005
精度修饰符为.
加上一个正数或者星号。
精度有以下作用:
这是一个例子,显示如何将一个浮点数指定为小数点后3位:
printf "%.3f" 1.61803398
输出:
1.618
当精度被设置为星号(*),那么精度的具体数值由后面的参数决定。
printf "%.*f" 3 1.61803398
1.618
printf
命令采用格式和参数的形式,打印一个格式化字符串。
如果你有任何疑问,请通过以下方式联系我们:
微信:
微信群: 加上面的微信,备注微信群
QQ: 3217680847
QQ 群: 82695646