在 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 prakashhello, abhishek! hello, prakash!
同时,也需要尽量匹配格式化字符串中所期望的数据类型:
通过上面的例子可以看到,如果没有找到匹配的参数,会使用默认值,默认字符串为 null,整数为 0.
printf hi %s, your room number is %d. \\n abhishek prakash 131bash: printf: prakash: invalid numberhi 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 带反斜杠转义字符的字符串
%% 百分号
一些例子
下面是一些比较简单的例子,通过命令就可以看出它的用法。
$ printf the octal value of %d is %o\\n 30 30the 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: helloworld!当使用 %c 时,它一次只读取一个字符:
$ printf character: %c\\n acharacter: a$ printf character: %c\\n a b ccharacter: acharacter: bcharacter: c$ printf character: %c\\n abccharacter: a使用修饰符以特定样式显示 printf 输出
有一些字符可以用于根据你的喜好来设置输出的样式。
# 用于显示八进制和十六进制数字
早些时候,我们使用过 %o 将十进制转为八进制,但是输出却不能很清楚的看出来这是一个八进制,所以现在我们使用修饰符 # 来正确的显示八进制和十六进制的数字。
$ printf %d is %#o in octal and %#x in hexadecimal\\n 30 30 3030 is 036 in octal and 0x1e in hexadecimal正整数的空格修饰符
可以在 % 和 d 之间加一个空格来显示带前导空格的正整数,当有正数和负数时,这样显示会更规范,如下所示:
$ printf %d \\n%d \\n%d \\n 10 -10 1010 -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 23age | 23设置精度
可以使用一个点 . 来指定 %d、%u、%o、%x 显示的最小位数,不足位的左侧以 0 补充。 如下所示:
$ printf roll number: %.5d\\n 23roll number: 00023如果对字符串使用精度修饰符,它会指定字符串的最大长度。 如果字符串较长,则会在显示中被截断。
$ printf name: %.4s\\n abhishekname: abhi还可以组合宽度和精度修改器:
$ printf name: %.4s\\n abhishekname: abhi$ printf name: %10.4s\\n abhishekname: abhi以表格格式显示输出
下面我们看一个稍微复杂一点的例子,在 bash 中使用 printf 命令打印如下表格:
名字身份证年龄成绩
福尔摩斯 0000122 23 一个
詹姆斯·邦德 0000007 27 f
赫拉克勒斯·波洛 0006811 59 g
简·马普尔 1234567 71 c
下面是我编写的脚本,大家根据各自情况可以尝试一下:
#/bin/bashseperator=--------------------seperator=$seperator$seperatorrows=%-15s| %.7d| %3d| %c\\ntablewidth=37printf %-15s| %-7s| %.3s| %s\\n name id age gradesprintf %.${tablewidth}s\\n $seperatorprintf $rows sherlock holmes 122 23 aprintf $rows james bond 7 27 fprintf $rows hercules poirot 6811 59 gprintf $rows jane marple 1234567 71 c运行,其输出如下:
MintBox 3系列迷你主机上架,搭载双千兆以太网端口
LabVIEW实时控制器担任着中央系统控制器的角色?
ROS软件平台对服务机器人的运算与控制
同步多火花模块(SMSM)的电子点火装置(Eid)
火炬气超声波流量计用于硫磺回收装置酸性气的流量测量
Linux bash中的printf命令详解
阻抗板的要素分别是什么
到底是什么导致:摩托罗拉无限期推迟智能手表项目
扩声系统设备的检修方法_扩声系统中设备故障的判断与排除
中小企业数字化转型与质量管理内生动力,突破核心研发瓶颈
基于无人机成像高光谱估算马铃薯植株氮含量-莱森光学
pcb设计中,PCB中图层的显示和布局同样重要
微软推出了一个“Mcabook到Surface Book”网站,让你随意跳转
皮肤杀手紫外线UVA波段领域中的传感器
“量子自旋磁力仪”亮相2023世界制造业大会
MAX8660/MAX8661电源管理IC (PMIC)
苹果计划推进电动汽车生产计划 股价最新上涨2.9%
全球多家央行正在探索和使用区块链项目
德承DS-1202加速工厂自主移动机器人布署
运动控制器以模拟量信号控制伺服电机的步骤