前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Bash Printf 命令

Bash Printf 命令

作者头像
雪梦科技
修改2020-06-06 00:05:56
4.1K0
修改2020-06-06 00:05:56
举报
文章被收录于专栏:ITCoderITCoderITCoder

本文最先发布在: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命令一些需要注意的点:

  • 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命令采用格式和参数的形式,打印一个格式化字符串。

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

微信:

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

QQ: 3217680847

QQ 群: 82695646

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020年06月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、printf 命令
  • 二、转义字符
  • 三、转换规格
    • 3.1 类型转换符
      • 3.2 符号指令
        • 3.3 宽度指令
          • 3.4 精度指令
          • 四、总结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档