服务器之家:专注于服务器技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - bash 中的格式化输出命令:printf

bash 中的格式化输出命令:printf

2023-05-08 17:12未知服务器之家 Linux

在 Linux 命令行中最简单的打印方法是使用 echo 命令: echo "Value of var is $var " 然而,echo 命令不支持格式化输出。要格式化输出,可以使用 printf 命令,bash 中的 printf 与 c/c++ 中的printf 命令类似: printf "My brother %s is %d years old.\n" Pra

bash 中的格式化输出命令:printf

在 Linux 命令行中最简单的打印方法是使用 echo 命令:

echo "Value of var is $var"

然而,echo 命令不支持格式化输出。要格式化输出,可以使用 printf 命令,bash 中的 printf 与 c/c++ 中的printf 命令类似:

printf "My brother %s is %d years old.\n" Prakash 21

其输出如下所示:

bash 中的格式化输出命令:printf

第一个参数 %s 接受一个字符串,第二个参数 %d 接受的是一个十进制整数,就跟 c/c++ 中的一样。接下来我们展示一些 bash printf 命令的例子。

bash 中的 printf 命令

printf 命令的语法如下:

printf format [arguments]

这里,format 是一个字符串,用于确定后续值的显示方式。

在上面的例子中 printf "My brother %s is %d years old.\n" Prakash 21,前面的语句 "My brother %s is %d years old.\n" 是格式,后面的 Prakash21 是参数,这些参数用于替换前面格式中的占位符 %s %d

在最简单的方式中,printf 的使用跟 echo 类似:

printf "Hello World\n"

注意到最后面的换行符 \n 了吗?echo 和 printf 命令的区别在于,echo 命令会自动在末尾添加一个换行符,但是 printf 命令需要手动添加。

bash 中的格式化输出命令:printf

要特别注意参数的类型和数量

这里需要注意,格式化字符串通常会尝试应用于所有参数。看下面的例子:​

$ printf "Hello, %s! \n" Abhishek Prakash
Hello, Abhishek!
Hello, Prakash!

bash 中的格式化输出命令:printf

同时,也需要尽量匹配格式化字符串中所期望的数据类型:

bash 中的格式化输出命令:printf

通过上面的例子可以看到,如果没有找到匹配的参数,会使用默认值,默认字符串为 null,整数为 0.​

printf "Hi %s, your room number is %d. \n" Abhishek Prakash 131
bash: printf: Prakash: invalid number
Hi Abhishek, your room number is 0.
Hi 131, your room number is 0.

上面代码中,Abhishek Prakash 会被用于第一个参数,131 会被用于第二个参数。

当它找到一个字符串(Prakash)而不是整数时,就会报错,但它会继续显示第二个参数为默认值0的输出。

类似地,它将131视为第二组参数中的字符串,由于第二个参数不存在,因此它默认为0。

规范格式字符

有几个格式说明符可用于以所需格式显示输出。以下是一些最常见的:

字符

用途

%s

String

%c

Single character

%d

Integers

%o

Octal integers

%x

Hexadecimal integers

%f

Floating point

%b

String with backslash escape character

%%

Percent sign

一些例子

下面是一些比较简单的例子,通过命令就可以看出它的用法。​

$ printf "The octal value of %d is %o\n" 30 30
The octal value of 30 is 36

让我们看看使用 %b 说明符来正确解释反斜杠转义字符。​

$ printf "String with backslash: %s\n" "Hello\nWorld!"
String with backslash: Hello\nWorld!

上面例子中 %s 正常使用,这个没有什么好解释的,但是参数中的 \n 换行符却没有起作用。这时候,需要用到 %b:

$ printf "String with backslash: %b\n" "Hello\nWorld!"
String with backslash: Hello
World!

当使用 %c 时,它一次只读取一个字符:

$ printf "Character: %c\n" a
Character: a
$ printf "Character: %c\n" a b c
Character: a
Character: b
Character: c
$ printf "Character: %c\n" abc
Character: a

使用修饰符以特定样式显示 printf 输出

有一些字符可以用于根据你的喜好来设置输出的样式。

# 用于显示八进制和十六进制数字

早些时候,我们使用过 %o 将十进制转为八进制,但是输出却不能很清楚的看出来这是一个八进制,所以现在我们使用修饰符 # 来正确的显示八进制和十六进制的数字。​

$ printf "%d is %#o in octal and %#x in hexadecimal\n" 30 30 30
30 is 036 in octal and 0x1e in hexadecimal

正整数的空格修饰符

可以在 % d 之间加一个空格来显示带前导空格的正整数,当有正数和负数时,这样显示会更规范,如下所示:​

$ printf "%d \n%d \n%d \n" 10 -10 10
10
-10
10
$ printf "% d \n%d \n% d \n" 10 -10 10
10
-10
10

宽度修改器

宽度修饰符是一个整数,用于指定参数的最小字段宽度。

默认情况下,它是右对齐的:​

$ printf "%10s| %5d\n" Age 23
Age| 23

可以使用中划线 - 来让其左对齐:

$ printf "%-10s| %-5d\n" Age 23
Age | 23

设置精度

可以使用一个点 . 来指定 %d%u%o%x 显示的最小位数,不足位的左侧以 0 补充。如下所示:​

$ printf "Roll Number: %.5d\n" 23
Roll Number: 00023

如果对字符串使用精度修饰符,它会指定字符串的最大长度。如果字符串较长,则会在显示中被截断。​

$ printf "Name: %.4s\n" Abhishek
Name: Abhi

还可以组合宽度和精度修改器:

$ printf "Name: %.4s\n" Abhishek
Name: Abhi
$ printf "Name: %10.4s\n" Abhishek
Name: Abhi

以表格格式显示输出

下面我们看一个稍微复杂一点的例子,在 bash 中使用 printf 命令打印如下表格:

Name

ID

Age

Grades

Sherlock Holmes

0000122

23

A

James Bond

0000007

27

F

Hercules Poirot

0006811

59

G

Jane Marple

1234567

71

C

下面是我编写的脚本,大家根据各自情况可以尝试一下:​

#/bin/bash
seperator=--------------------
seperator=$seperator$seperator
rows="%-15s| %.7d| %3d| %c\n"
TableWidth=37
printf "%-15s| %-7s| %.3s| %s\n" Name ID Age Grades
printf "%.${TableWidth}s\n" "$seperator"
printf "$rows" "Sherlock Holmes" 122 23 A
printf "$rows" "James Bond" 7 27 F
printf "$rows" "Hercules Poirot" 6811 59 G
printf "$rows" "Jane Marple" 1234567 71 C

运行,其输出如下:

bash 中的格式化输出命令:printf

延伸 · 阅读

精彩推荐
  • Linux理解 Linux/Unix 登录脚本的技巧

    理解 Linux/Unix 登录脚本的技巧

    有一些常见的情况,例如从Debian的包管理程序到Iaas的管理中,很多任务需要设置环境变量才能正常运行。 有时,程序通常只需要在 登陆时运行一次,例如...

    未知1042023-05-12
  • Linuxlinux驱动程序开发详细介绍

    linux驱动程序开发详细介绍

    前提,一般来说内核代码的错误可能会引起一个用户进程的死亡,或者整个系统的瘫痪,更严重的后果,可能导致磁盘损伤~因此建议最好有一台实验机进行...

    Linux教程网5392019-12-17
  • Linuxlinux设置tomcat自启动的方法

    linux设置tomcat自启动的方法

    这篇文章主要介绍了linux设置tomcat自启动的方法,需要的朋友可以参考下...

    Linux教程网8512021-10-10
  • Linuxssh 登录很慢该如何解决

    ssh 登录很慢该如何解决

    这篇文章主要介绍了ssh 登录很慢该如何解决的相关资料,这里提供了两种方法,DNS反向解析及关闭ssh的gssapi认证的解决办法,需要的朋友可以参考下...

    linuxeye9922021-12-16
  • Linux在Linux系统中创建新的亚马逊AWS访问密钥的方法

    在Linux系统中创建新的亚马逊AWS访问密钥的方法

    如何在Linux系统中创建新的亚马逊AWS访问密钥?我在配置一个需要访问我的亚马逊AWS帐号的应用时被要求提供AWS访问密钥ID和秘密访问密钥,我怎样创建一个...

    Linux教程网6182019-10-30
  • LinuxLinux系统下无法卸载挂载的目录怎么办?

    Linux系统下无法卸载挂载的目录怎么办?

    我们在日常运维中经常性会遇到需要进行磁盘的扩容、卸载、挂载等操作,但是有时候这个系统上跑的应用并没有停止或者有其他的运维同事在操作这个目...

    今日头条10302020-12-30
  • Linux将 Linux 终端与 Nautilus 文件管理器结合起来

    将 Linux 终端与 Nautilus 文件管理器结合起来

    Nautilus 是 GNOME 桌面环境中的图形化文件浏览器。你可以使用它来访问和管理系统中的文件和文件夹。 尽管并非所有人都喜欢使用终端来管理文件和目录,...

    未知812023-08-08
  • Linuxlinux top命令详解

    linux top命令详解

    这篇文章主要介绍了linux top命令详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    sparkdev5622022-03-01