文章目录
{ .ImgAlt }}

通常,在写 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命令一些需要注意的点:

  • 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\nformat,而"34"和"65"是参数。字符串格式包含了两个换行符(\n)和两个将被参数替换的格式符(%s)。

二、转义字符

转义字符放在格式化字符串或者参数中将会被解释,类似于%b转换符。这里是一些常用的转义字符:

  • \\ - 显示一个反斜杠符号
  • \b - 显示一个后退字符
  • \n - 显示一个换行符
  • \r - 显示一个回车符
  • \t - 显示一个横向制表符
  • \v - 显示一个竖向制表符

三、转换规格

一个转换规格如下:

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

每一个转换规格以%开头,包含一个可选的修饰符并且以下面的字符结尾aAbcdeEfgGioqsuxX

3.1 类型转换符

类型转换符是一个用来和参数进行对应的字符。这个字符是必须的,并且在可选的文本域后面。

下面是一个列表,显示各种类型转换符,以及他们的作用:

  • %b - 将参数中支持的反斜杠转义字符转义以后再打印
  • %q - 将参数按可以作为shell输入重用的格式打印
  • %d, %i - 将参数按有符号十进制整数打印
  • %u - 将参数按无符号数打印
  • %o - 将参数按无符号八进制数打印
  • %x, %X - 将参数按无符号十六进制数打印
  • %e, %E - 将参数按double解释,并以科学计数法的形式打印。 %e 打印成小写字母, %E打印成大写字母。
  • %a, %A - 将参数按double解释,并以C99十六进制浮点常量形式打印。 %a 打印成小写字母, %A打印成大写字母。
  • %g, %G - 将参数按double解释,并以%e或%f的形式打印。 %g 打印成小写字母, %G打印成大写字母。
  • %c - 将参数作为一个单个字符打印
  • %f - 将参数作为一个浮点型数字打印
  • %s - 将参数作为一个字符串打印
  • %% - 仅仅打印一个%符号

3.2 符号指令

符号指令是可选修饰符,被用来调整,补0,等等。

下面是通用情况:

  • - - 左对齐文本。默认情况下,文本是右对齐的。
  • + - 在数字前面添加+或者-号。默认情况下,仅仅负数前面加上-号。
  • 0 - 空白处补0
  • 空白 - 在正数和负数前面补充空格
  • # - 数字格式

3.3 宽度指令

width指令被放置在任何符号字母的前面,用来指定转换结果的宽度。

如果输出结果宽度小于指定宽度,补充空格。宽度可以被指定为一个非负数或者一个星号(*)

这里是一个例子:

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

%20s意思是设置至少20个字母长度。在文本前面放置空白,因为默认输出是右对齐的。想要文本左对齐,使用-符号(%-20s)。

      Mark 305

当宽度使用星号(*)的时候,字符宽度由后面具体提供的参数决定。

在下面的这个例子中,宽度被设置成10:

printf "%0*d" 10 5

0是一个标记,意思是补0,而不是补空格。输出文本至少10个字符:

0000000005

3.4 精度指令

精度修饰符为.加上一个正数或者星号。

精度有以下作用:

  • 如果转换类型为整数,精度就是打印的数字最小位数。如果参数的数字位数小于精度,补0。
  • 如果转换类型为浮点型,精度则指定了小数点后面的位数。默认的精度为6。
  • 如果转换类型是文本字符串,精度指定了最大字符数目。如果字符数目比指定的精度要大,那么超过的字符将会被截断。

这是一个例子,显示如何将一个浮点数指定为小数点后3位:

printf "%.3f" 1.61803398

输出:

1.618

当精度被设置为星号(*),那么精度的具体数值由后面的参数决定。

printf "%.*f" 3 1.61803398
1.618

四、总结

printf命令采用格式和参数的形式,打印一个格式化字符串。

腾讯云:新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。



如果你有任何疑问,请通过以下方式联系我们:

微信:

微信群: 加上面的微信,备注微信群

QQ: 3217680847

QQ 群: 82695646 雪梦科技交流群

原文 :https://linuxize.com/post/bash-printf-command/

    版权声明:本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。知识共享许可协议
阿里云: 爆款云服务器低至1折,1核1G 1M 仅17月/月

相关推荐