使用 Bash printf 命令打印格式化输出

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

echo "Value of var is $var"

但是,当您需要打印格式化输出时, echo 命令将不够用。

这是 printf 命令可以帮助您的地方。 这 bash printf 命令的操作类似于 C/ 中的 printf 命令C++ 编程语言.

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

你能猜出输出吗?

第一个论据 %s 需要一个字符串, %d 需要一个十进制整数,就像 C/C++ 一样。 如果您不熟悉 C/C++,请不要担心。

您不需要仅仅为了在 Bash 脚本中使用 printf 命令而学习它。 让我向您展示一些 Bash printf 命令的示例。

使用 Bash printf 命令

让我们先从语法开始。

printf format [arguments]

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

在里面 example 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 Worldn"

注意换行符 n 在末尾? 这 echo 和 printf 命令的区别 是 echo 在末尾自动添加一个换行符,但是对于 printf,您必须显式添加它。

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

请记住,格式字符串会尝试应用于所有参数。 这就是为什么你应该特别注意它的原因。

[email protected]:~$ printf "Hello, %s! n" Abhishek Prakash
Hello, Abhishek! 
Hello, Prakash!
示例 bash printf 命令

同样,您还应该注意它在格式字符串中期望的格式说明符类型。

bash  printf 命令示例

正如你在上面看到的 example,如果它没有找到预期的参数,它会显示默认值,即字符串为 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细绳
%C单个字符
%d整数
%o八进制整数
%X十六进制整数
%F浮点
%b带有反斜杠转义字符的字符串
%%百分号

现在您已经熟悉了格式说明符,让我们看一些更多的例子来展示它们的作用。

bash printf 命令示例

我认为您不需要对这些示例中的大多数进行详细解释,因为它们是不言自明的。

[email protected]:~$ printf "The octal value of %d is %on" 30 30
The octal value of 30 is 36

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

[email protected]:~$ printf "String with backslash: %sn" "HellonWorld!"
String with backslash: HellonWorld!

你看 %s, 没有什么不同的。 但随着 %b 新行转义字符将被正确解释:

[email protected]:~$ printf "String with backslash: %bn" "HellonWorld!"
String with backslash: Hello
World!

当您使用 %c,它一次只读取字符。

[email protected]:~$ printf "Character: %cn" a
Character: a
[email protected]:~$ printf "Character: %cn" a b c
Character: a
Character: b
Character: c
[email protected]:~$ printf "Character: %cn" abc
Character: a

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

有一些修饰符可以根据您的喜好更改输出的外观。

# 八进制和十六进制数的修饰符

之前你看到了使用 %o 用于将十进制转换为八进制。 但是,不清楚它是否是八进制数。 您可以使用 # 修饰符以正确格式显示八进制和十六进制数字。

[email protected]:~$ printf "%d is %#o in octal and %#x in hexadecimaln" 30 30 30
30 is 036 in octal and 0x1e in hexadecimal

正整数的空间修饰符

您可以在之间使用空格 %d%d 显示带有前导空格的正整数。 当您有一列正数和负数时,这会有所帮助。 看看哪个看起来更“漂亮”:

[email protected]:~$ printf "%d n%d n%d n" 10 -10 10
10 
-10 
10 
[email protected]:~$ printf "% d n%d n% d n" 10 -10 10
 10 
-10 
 10 

宽度修饰符

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

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

[email protected]:~$ printf "%10s| %5dn" Age 23
       Age|    23

您可以通过添加使其左对齐 - 标记它:

[email protected]:~$ printf "%-10s| %-5dn" Age 23
Age       | 23

精密改性剂

您可以使用精度修饰符 (.) 点来指定要显示的最小位数 %d, %u, %o, %x. 它在值的左侧添加零填充。

[email protected]:~$ printf "Roll Number: %.5dn" 23
Roll Number: 00023

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

[email protected]:~$ printf "Name: %.4sn" Abhishek
Name: Abhi

您可以结合使用宽度和精度修饰符:

[email protected]:~$ printf "Name: %.4sn" Abhishek
Name: Abhi
[email protected]:~$ printf "Name: %10.4sn" Abhishek
Name:       Abhi

奖励示例:使用 printf 以表格格式显示输出

让我们通过稍微复杂一点的方式,将您学到的有关 printf 命令的知识用在一些有用的地方 example. 这将展示 printf 命令在 bash 脚本。

让我们使用 printf 命令打印下表 bash:

姓名ID年龄成绩
夏洛克·福尔摩斯000012223一种
占士邦000000727F
大力神波洛000681159G
简·马普尔123456771C

这是我为此任务编写的 shell 脚本。 您的脚本可能会有所不同:

#/bin/bash
seperator=--------------------
seperator=$seperator$seperator
rows="%-15s| %.7d| %3d| %cn"
TableWidth=37

printf "%-15s| %-7s| %.3s| %sn" Name ID Age Grades
printf "%.${TableWidth}sn" "$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 shell脚本,这是它打印的内容:

使用它是不是很棒 bash printf 命令为您的脚本打印格式精美的输出?

我希望你喜欢这个关于 Linux 中 printf 命令的详细教程。 如果您有任何问题或建议,请告诉我。 并且不要忘记成为 Linux 手册的成员,以获取更多此类信息性 Linux 学习。