Linux学习笔记-printf命令

整体来说,printf类似为C语言的printf()函数,printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认的 printf 不会像 echo 自动添加换行符,我们需要手动添加 \n。

printf的作用:

  1. 1、格式控制:可以指定字段宽度、精度和对齐方式。
  2. 例如,%10s,可以让字符串强制显示10个字符,不足10个在前面补空格。%10d让整数强制显示10个字符,不足10个同样是补空格。

2、类型安全:不同类型的数据(整数、浮点数、字符串等)有对应的格式说明符。

3、可移植性:行为在不同系统和Shell中更加一致。

4、复杂输出:适合生成表格、报表等结构化输出。

7.1 基本语法:

printf format-string arguments...

参数说明:

format-string:表示格式说明符或者普通字符串。

arguments... 与格式说明符对应的参数,例如变量或者字符串值。

格式说明符由 % 字符开始,后跟一个或多个字符,用于指定输出的格式。

%后可以跟一个整数n,表示显示字节数为n的字符串/字符/数据,原串超过n就原样显示,否则就前面补空格。这里需要注意,中文汉字和标点都占3个字节。

7.1.1 常用的格式说明符

%s:处理字符串:

%d:处理10进制整数。

%f:处理浮点数,默认保留6位小数,不足6位就补0。如果需要指定保留的小数位数,要在%或者%x后面跟一个.n,保留n位小数:

%c:处理字符。

%x:处理十六进制数,会将数据自动转换成十六进制数:

%o:处理八进制数。

%b:处理二进制数。

%e:用科学计数法表示小数:

7.1.2 工作流程

1、解析格式字符串,遇到普通字符直接输出。

2、遇到格式说明符(以%开头)时:

    1. 读取下一个参数。
  1. 按照说明符指定的格式处理该参数。
  1. 将结果插入到输出中。
  1. 处理完所有格式说明符后,输出最终结果。

7.2 实践示例

7.2.1 基本使用

如下代码测试一下简单的字符串输出和带变量的输出:

结果:

7.2.2 格式化控制

如下代码用不同方式将两段不同长度字符串对齐:

说明:printf "|%*s|\n" `expr {#hello} + 10\` "{hello}"

这段代码中%和s这种格式说明符之间可以加*号表示输出的字符串长度是变量。`expr ${#hello} + 10`这个表达式是结果就是*的具体值。

整体代码的作用就是让这两个字符串都显示出10的宽度。之所以这里不直接用%10s是因为,在计算字符串宽度时,一个汉字字符是3字节,但是最终显示的时候,一个字符的宽度只会显示2列,导致出现错位:

比如"早安"两个字在这种情况下就会显示2*2+(10-2*3)=8列。

而"你也是"三个字会显示3*2+(10-3*3)=7列。

而${#hello} + 10这个表达式怎么得来的,由于篇幅限制就不展开了。

结果如下:

如果是纯英文字符那就直接使用%10s即可。

7.2.3 多参数显示

这个直接在格式字符串那写入多个即可,空格分割、参数处字符串按照"双引号+空格分割,其他空格分割:

如果没有注意双引号做分割就会这样:

7.3 进阶用法

菜鸟教程上有很多,大部分我都自己能实现,并且功能重复,我就不一一列举了。这里我只做一个格式化输出:

这里注意,lunux系统很坑,汉字如果字数不一致容易对不齐,这里我手动微调了一些数值。

结果:

7.4 printf的转义字符

这几个跟echo的转义符意义相同:\b退格、\n换行、\r回车、\t水平制表、\v垂直制表、\\反斜杠本身,就不详细展开了。

\a:警告字符,通常为ASCII的BEL字符。

\c:抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略。

\f:换页(formfeed)

\ddd:表示1到3位数八进制值的字符。仅在格式字符串中有效

\0ddd:表示1到3位的八进制值字符。

相关推荐
zhendianluli4 分钟前
VS Code Remote-SSH 连接故障排查手册(精详版)
运维·ssh
Tim风声(网络工程师)10 分钟前
Kail下载
linux·运维·服务器
JXJD20041 小时前
光模块自动化组装设备 工艺体系与选型指南
运维·自动化
AOwhisky1 小时前
Linux 网络服务架设学习笔记(第五期)——Web 服务(上篇):Apache HTTP Server——从静态到动态
linux·运维·服务器·笔记·学习·云计算·apache
zbyyd1 小时前
Linux 多线程:互斥锁 & 信号量
linux·c语言·开发语言·网络
船厂电气自动化ai大模型1 小时前
AI大模型与数学·第57课 傅里叶全套工具链综合实战:串联级数/连续变换/DFT/FFT,图像、音频、扩散模型完整例题
数据结构·人工智能·深度学习·算法·机器学习
斑马1392 小时前
Linux软件编程学习笔记(四)——进程
linux·运维·服务器
扛枪的书生2 小时前
Linux 三剑客 - Awk 命令指南
linux·运维
人工智能培训2 小时前
人工智能数据安全下的个人信息保护实践方案
大数据·人工智能·算法·生活
MaximusCoder2 小时前
等保测评命令——weblogic
运维·安全·安全威胁分析