4

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

 1 year ago
source link: https://www.51cto.com/article/751701.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
d26a2f5508087f1cc54102a70f50cb147c2e0c.jpg

在 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

其输出如下所示:

图片

第一个参数 %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" 是格式,后面的 Prakash 和 21 是参数,这些参数用于替换前面格式中的占位符 %s 和 %d。

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

printf "Hello World\n"

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

图片

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

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

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

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

图片

通过上面的例子可以看到,如果没有找到匹配的参数,会使用默认值,默认字符串为 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。

规范格式字符

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

  String

  Single character

  Integers

  Octal integers

  Hexadecimal integers

  Floating point

  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 命令打印如下表格:

  Grades  

Sherlock Holmes

0000122

James Bond

0000007

Hercules Poirot

0006811

Jane Marple

1234567

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

#/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

运行,其输出如下:

图片

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK