针对初学者的 Linux Xargs 命令的 12 个实用示例
2024年3月17日在 Linux 中使用 fsck 命令检查和修复文件系统错误
2024年3月17日在 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
你能猜出输出吗?
![](https://www.alaica.com/wp-content/uploads/linux-343.png)
第一个参数%s
需要一个字符串,%d
需要一个十进制整数,就像 C/C++ 一样。如果您不熟悉 C/C++,请不要担心。
您不需要仅仅为了在 Bash 脚本中使用 printf 命令而学习它。让我向您展示一些 Bash printf 命令的示例。
使用 Bash printf 命令
我们首先从语法开始。
printf format [arguments]
这里,format
是一个字符串,用于确定后续值的显示方式。
在示例中printf "My brother %s is %d years old.n" Prakash 21
,整个“我的兄弟 %s 是 %d 岁。n”是格式,后面是参数Prakash
和21
。这些参数用于替换格式说明符(%s、%d 等),我将在本文后面对此进行解释。
printf 最简单的形式可以用作显示字符串的 echo 命令。
printf "Hello Worldn"
n
注意到末尾的新行字符了吗?echo 和 printf 命令之间的区别在于echo 会自动在末尾添加换行符,但对于 printf,您必须显式添加它。
![](https://www.alaica.com/wp-content/uploads/linux-344.png)
特别注意参数的类型和数量
请记住,格式字符串会尝试应用于所有参数。这就是为什么你应该特别注意它。
abhishek@handbook:~$ printf "Hello, %s! n" Abhishek Prakash
Hello, Abhishek!
Hello, Prakash!
![](https://www.alaica.com/wp-content/uploads/linux-345.png)
同样,您还应该注意格式字符串中期望的格式说明符类型。
![](https://www.alaica.com/wp-content/uploads/linux-346.png)
正如您在上面的示例中看到的,如果没有找到预期的参数,它会显示默认值,对于字符串为 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 | 带有反斜杠转义字符的字符串 |
%% | 百分号 |
现在您已经熟悉了格式说明符,让我们看一些展示它们实际作用的示例。
![](https://www.alaica.com/wp-content/uploads/linux-51.jpg)
Bash printf 命令示例
我认为您不需要对大多数示例进行详细解释,因为它们是不言自明的。
abhishek@handbook:~$ printf "The octal value of %d is %on" 30 30
The octal value of 30 is 36
让我们看看如何使用%b
说明符来正确解释反斜杠转义字符。
abhishek@handbook:~$ printf "String with backslash: %sn" "HellonWorld!"
String with backslash: HellonWorld!
你看%s
,这没有什么区别。但使用%b
新行转义字符将被正确解释:
abhishek@handbook:~$ printf "String with backslash: %bn" "HellonWorld!"
String with backslash: Hello
World!
当您使用 时%c
,它一次只读取一个字符。
abhishek@handbook:~$ printf "Character: %cn" a
Character: a
abhishek@handbook:~$ printf "Character: %cn" a b c
Character: a
Character: b
Character: c
abhishek@handbook:~$ printf "Character: %cn" abc
Character: a
使用修饰符以特定样式显示 printf 输出
有一些修改器可以根据您的喜好更改输出的外观。
# 八进制和十六进制数字的修饰符
之前您已经看到了将十进制转换为八进制的用法%o
。然而,并不清楚它是一个八进制数。您可以使用#
修饰符以正确的格式显示八进制和十六进制数字。
abhishek@handbook:~$ printf "%d is %#o in octal and %#x in hexadecimaln" 30 30 30
30 is 036 in octal and 0x1e in hexadecimal
正整数的空格修饰符
%
您可以在和d
in之间使用空格%d
来显示带前导空格的正整数。当您有一列正数和负数时,这会有所帮助。看看哪一个看起来更“漂亮”:
abhishek@handbook:~$ printf "%d n%d n%d n" 10 -10 10
10
-10
10
abhishek@handbook:~$ printf "% d n%d n% d n" 10 -10 10
10
-10
10
宽度调节器
宽度修饰符是一个整数,指定参数的最小字段宽度。
默认情况下,它是右对齐的:
abhishek@handbook:~$ printf "%10s| %5dn" Age 23
Age| 23
-
您可以通过添加标志来使其左对齐:
abhishek@handbook:~$ printf "%-10s| %-5dn" Age 23
Age | 23
精度调节器
%d
您可以使用精度修饰符 (.) 点指定要通过, %u
, %o
,显示的最小位数%x
。它在值的左侧添加零填充。
abhishek@handbook:~$ printf "Roll Number: %.5dn" 23
Roll Number: 00023
如果对字符串使用精度修饰符,则它指定字符串的最大长度。如果字符串较长,则会在显示中被截断。
abhishek@handbook:~$ printf "Name: %.4sn" Abhishek
Name: Abhi
您可以结合使用宽度和精度修饰符:
abhishek@handbook:~$ printf "Name: %.4sn" Abhishek
Name: Abhi
abhishek@handbook:~$ printf "Name: %10.4sn" Abhishek
Name: Abhi
额外示例:使用 printf 以表格格式显示输出
让我们通过一个稍微复杂的示例来充分利用您所学到的有关 printf 命令的知识。这将展示 bash 脚本中 printf 命令的真正潜力。
让我们使用 printf 命令在 bash 中打印下表:
姓名 | ID | 年龄 | 成绩 |
---|---|---|---|
夏洛克·福尔摩斯 | 0000122 | 23 | A |
占士邦 | 0000007 | 27 | F |
赫拉克勒斯·波洛 | 0006811 | 59 | G |
简·马普尔 | 1234567 | 71 | C |
这是我为此任务编写的 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 脚本,它会打印以下内容:
![](https://www.alaica.com/wp-content/uploads/linux-347.png)
使用 bash printf 命令为脚本打印格式精美的输出不是很棒吗?
我希望您喜欢这个有关 Linux 中 printf 命令的详细教程。如果您有疑问或建议,请告诉我。并且不要忘记成为 Linux 手册的成员,以获取更多此类信息性 Linux 学习内容。