在Linux命令行中最简单的打印方法是使用echo命令。
linuxmi@linuxmi:~/www.linuxmi.com$ echo “Value of var is $var”
但是,当您需要打印格式化的输出时,echo命令是不够的。
这是printf命令可为您提供帮助的地方。bash printf命令的操作类似于C/C ++编程语言中的printf命令。
linuxmi@linuxmi:~/www.linuxmi.com$ printf “我的兄弟 %s 今年 %d 岁.\n” 当年的大师兄 28
你能猜出输出吗?
与C/C++一样,第一个参数%s需要一个字符串,%d需要一个十进制整数。 如果您不熟悉C/C ++,也不要担心。
您不需要仅仅为了在Bash脚本中使用printf命令而学习它。让我向您展示一些Bash printf命令的示例。
使用Bash printf命令
让我们先从语法开始。
printf format [arguments]
这里,format是一个字符串,它决定了如何显示后续的值。
在示例 printf “我的兄弟 %s 今年 %d 岁.\n” 当年的大师兄 28 中。“我的兄弟 %s 今年 %d 岁.\n”是format,后面跟着参数当年的大师兄和28。这些参数用于替换格式说明符(%s、%d等),我将在本文后面对此进行解释。
以最简单的形式,printf可以用作显示字符串的echo命令。
linuxmi@linuxmi:~/www.linuxmi.com$ printf “Hello World www.linuxmi.com Linux迷 \n”
注意末尾的换行符\n吗? echo和printf命令之间的区别在于,echo会在末尾自动添加一个新行字符,但对于printf,则必须显式添加它。
特别注意参数的类型和数量
请记住,格式字符串会尝试应用于所有参数。 这就是为什么您应该特别注意它的原因。
linuxmi@linuxmi:~/www.linuxmi.com$ printf “Hello, %s! \n” www.linuxmi.com Linux迷
Hello, www.linuxmi.com!
Hello, Linux迷!
同样,您还应该注意格式字符串中需要的格式说明符类型。
如上例所示,如果找不到预期的参数,它将显示默认值,字符串为null,整数为0。
linuxmi@linuxmi:~/www.linuxmi.com$ printf “你好 %s, 我们的网址为 %d. \n” Linux迷 www.linuxmi.com 628
bash: printf: www.linuxmi.com: 无效数字
你好 Linux迷, 我们的网址为 0.
你好 628, 我们的网址为 0.
这里,它将Linux迷 www.linuxmi.com作为第一组参数,将628作为第二组参数。
当它找到一个字符串(www.linuxmi.com)而不是整数时,它会报错,但它会继续以默认值0显示第二个参数的输出。
类似地,它将628作为第二组参数中的字符串,由于第二个参数不存在,它默认为0。
format的格式说明字符
有几种格式说明符可用于以所需格式显示输出。以下是一些最常见的方法:
字符 | 用法 |
---|---|
%s | 字符串 |
%c | 单个字符 |
%d | 整数 |
%o | 八进制整数 |
%x | 十六进制整数 |
%f | 浮点数 |
%b | 带反斜杠转义符的字符串 |
%% | 百分号 |
现在您已经熟悉了格式说明符,下面让我们看一些更多的示例来说明它们的实际作用。
Bash printf命令示例
我认为您不需要为大多数示例进行详细说明,因为它们是不言自明的。
linuxmi@linuxmi:~/www.linuxmi.com$ printf “%d 的八进制值是 %o\n” 30 30
30 的八进制值是 36
让我们看看如何使用%b说明符来正确解释反斜杠转义字符。
linuxmi@linuxmi:~/www.linuxmi.com$ printf “带反斜杠的字符串: %s\n” “Hello\nWorld!”
您看到的是%s,这没有什么区别。 但是使用%b可以正确解释新的换行符:
linuxmi@linuxmi:~/www.linuxmi.com$ printf “字符串与反斜杠: %b\n” “Hello\nWorld!”
使用%c时,它一次只能读取一个字符。
linuxmi@linuxmi:~/www.linuxmi.com$ printf “Character: %c\n” a
Character: a
linuxmi@linuxmi:~/www.linuxmi.com$ printf “Character: %c\n” a b c
Character: a
Character: b
Character: c
linuxmi@linuxmi:~/www.linuxmi.com$ printf “Character: %c\n” abc
Character: a
正整数的空间修饰符
您可以在%d中使用%和d之间的空格来显示带前导空格的正整数。 当您有一列正数和负数时,这会有所帮助。 看看哪个看起来更“漂亮”:
linuxmi@linuxmi:~/www.linuxmi.com$ printf “%d \n%d \n%d \n” 70 -70 70
linuxmi@linuxmi:~/www.linuxmi.com$ printf “% d \n%d \n% d \n” 70 -70 70
宽度修改符
宽度修饰符是一个整数,它指定参数的最小字段宽度。
默认情况下,它是右对齐的:
linuxmi@linuxmi:~/www.linuxmi.com$ printf “%10s| %5d\n” 12月 25
您可以通过添加-标志使其左对齐:
linuxmi@linuxmi:~/www.linuxmi.com$ printf “%-10s| %-5d\n” 12月 25
精度修饰符
您可以使用精度修饰符(.) 点来来指定要用%d, %u, %o, %x显示的最小数字数目。它将在值的左侧添加零填充。
linuxmi@linuxmi:~/www.linuxmi.com$ printf “Roll Number: %.5d\n” 628
Roll Number: 00628
如果对字符串使用精度修饰符,则它指定字符串的最大长度。如果字符串较长,则会在显示中被截断。
linuxmi@linuxmi:~/www.linuxmi.com$ printf “Name: %.5s\n” LinuxMi
Name: Linux
您可以结合使用宽度和精度修饰符:
linuxmi@linuxmi:~/www.linuxmi.com$ printf “Name: %.5s\n” LinuxMi
Name: Linux
linuxmi@linuxmi:~/www.linuxmi.com$ printf “Name: %10.5s\n” LinuxMi
Name: Linux
再来一个额外的示例:用printf显示表格格式的输出
让我们在一个稍微复杂一些的示例中充分利用您了解的关于printf命令的知识。这将展示bash脚本中printf命令的真正潜力。
让我们使用printf命令使用bash打印以下表:
Linux | ID | Order | Sorting |
---|---|---|---|
Ubuntu | 0000100 | 99 | A |
CentOS | 0000101 | 77 | F |
openSUSE | 0000102 | 88 | G |
Red Hat | 0000103 | 66 | C |
下面是我为这个任务编写的shell脚本。你的脚本可能会有所不同:
#/bin/bash
linuxmi=——————–
linuxmi=$linuxmi$linuxmi
rows=”%-16s| %.7d| %3d| %c\n”
TableWidth=38
printf “%-15s| %-7s| %.3s| %s\n” Linux ID Order Sorting
printf “%.${TableWidth}s\n” “$linuxmi”
printf “$rows” “Ubuntu” 100 99 U
printf “$rows” “CentOS” 101 77 C
printf “$rows” “openSUSE” 102 88 O
printf “$rows” “Red Hat” 103 66 R
现在,如果我运行此bash shell脚本,将显示以下内容:
使用bash printf命令为脚本打印格式精美的输出不香吗?
我希望您喜欢Linux上有关printf命令的详细教程。 如果您有任何问题或建议,请告诉我。