shell printf详解

2024-06-21 11:44
文章标签 详解 shell printf

本文主要是介绍shell printf详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

默认的 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。

1. printf命令语法组成:

printg format-string [arguments]

第一部分为格式化字符串,该字符串最好用引号括起来

第二部分为参数列表,例如字符串或变量值的列表,该列表需与第一个参数格式相对应.

1.1. format参数

参数

含义

举例

%b

打印相关内容并解释其中反斜杠"\"的特殊字符

printf "|%b|\n" "a\tb" ---> |a b|

%c

输出一个字符

printf "|%c|\n" abc ---> |a|

%q

以shell引用的格式打印相关内容,使其可以在标准输入中重用

%d

以带符号十进制的格式打印相关内容

printf "%d\n" 20 ---> 20

%i

与%d相同

printf "%i\n" 20 ---> 20

%o

以无符号八进制格式打印相关内容

printf "%o\n" 20 ---> 24

%u

:以无符号十进制格式打印相关内容

printf "%u\n" 20 ---> 20

%x

以无符号小写十六进制打印相关内容

printf "%x\n" 20 ---> 14

%X

以无符号大写十六进制打印相关内容

printf "%X\n" 20 ---> 14

%f

以浮点数的格式解析并打印相关内容

printf "|%f|\n" 2.2 ---> |2.200000|

%e

以用科学记数法(e 记数法)表示的浮点数

printf "|%e|\n" 2.2 ---> |2.200000e+00|

%E

与%e相同,只是字母用大写

printf "|%E|\n" 2.2 ---> |2.200000E+00|

%g

选用e或f中较短的一种形式

printf "|%g|\n" 2.2 ---> |2.2|

%G

以%f或者%e格式打印相关内容

printf "|%G|\n" 2.2 ---> |2.2|

%s

以字符串的格式打印相关内容

printf "|%s|\n" "a\tb" ---> |a\tb|

%n

指定打印字符的个数

printf "|%4s|\n" "abc" ---> | abc|

%%

%字符

printf "|%d%%|\n" 100 ---> |100%|

1.2. printf标志字符

printf标志字符

含义

举例

-

将字段里已格式化的值向左对齐

printf "|%5d|\n" 1 ===> | 1| 对比 printf "|%-5d|\n" 1 ===》 |1 |

空格

在正值前置一个空格,在负值前置一个负号

printf "|%d|\n" 20 ===》 |20| 对比 printf "|% d|\n" 20 ===》| 20|

printf "|%d|\n" -20 ===》|-20| 对比 printf "|% d|\n" -20 ===》|-20|

+

总是在数值之前放置一个正号或负号,即便是正值也是

printf "%+d\n" 20 ===》 +20 对比 printf "%d\n" 20 ===》20

printf "%+d\n" -20 ===》 -20 对比 printf "%d\n" -20 ===》-20

#

用于8进制%o时,会使字符前面多个0

用于16进制%x,%X时,会使字符前面多个0X

用于%e,%E与%f,总是在结果中有一个小数点;

%g与%G为没有结尾的零.

printf "%o\n" 20 ===》 24 对比 printf "%#o\n" 20 ===》 024

printf "%x\n" 20 ===》 14 对比 printf "%#x\n" 20 ===》 0x14

printf "%g\n" 1.123 ===》1.123 对比 printf "%#g\n" 1.123 ===》 1.12300

0

以零填补输出,而非空白.这仅发生在字段宽度大于转换后的情况.

printf "|%5d|\n" 1 ===》 | 1| 对比 printf "|%05d|\n" 1 ===》|00001|

1.3. format转义符

转义序列只在格式字符串中会被特别对待,也就是说,出现在参数字符串里的专利序列不会被解释:

使用命令:printf "%s\n" "abc\ndef"

输出结果:abc\ndef

转义符

含义

举例

\"

打印"符号

printf "|%s\"|\n" "abc" ---> |abc"|

\NNN

用八进制的值表示一个ASCII字符

printf "|\141|\n" ---> |a|

\\

打印\符号

printf "|%s\\|\n" "abc" ---> |abc\|

\a

发出警告声

\b

向前删除一个字符

printf "|%s\b|\n" "abc" ---> |ab|

\f

换页符,在某些实现中会清屏,有些会换行

\n

换行符

\r

不换行,光标在行首

\t

制表符

printf "|%s\t|\n" abc ---> |abc |

\v

垂直制表符

\xHH

用十六进制的值表示一个ASCII字符

printf "|\x61|\n" ---> |a|

1.4. 精度的含义

精度的含义

转换

精度含义

举例

%d,%i,%o,%u,%x,%X

要打印的最小位数.

当值的位数少于此数字时,

会在前面补零.默认精度为1

printf "|%5d|\n" 1000 ==》 | 1000|

#没有点的时候,d前面的数字5表示宽度,字符长度不足5的,右对齐,不足用空格补齐
printf "|%.5d|\n" 1000 ===》 |01000|

#有点的时候,d前面的数字表示宽度

%e,%E

要打印的最小位数.

当值的位数少于此数字时,

会在小数点后面补零,默认为精度为6.

精度为0则表示不显示小数点右边的位数

printf "|%.5e|\n" 2214.123456 ===》|2.21412e+03| #精度5,长度够,不补0
printf "|%.5e|\n" 2214 ===》|2.21400e+03| #精度5,长度不够,补了2个0

printf "|%20e|\n" 222 ===> | 2.220000e+02|

#没有点的时候,20代表占位宽带,精度保持默认值6,右对齐,不足用空格补齐

printf "|%.0e|\n" 222 ===》 |2e+02| #精度为0,不显示小数点右边的位数

------------------------------------------
printf "%10e\n" 1.123456654321 ===》1.123457e+00

printf "%e\n" 1.123456654321 ===》1.123457e+00 #没有.的时候,无论e前面有没有数字,小数点后面都只保留6位,而且取最后一位近似值

------------------------------------------

%f

小数点右边的位数

printf "|%10f|\n" 1.123456654321 ===》 | 1.123457|
#没有点的时候,f前面的数字不代表精度,代表占位宽带,精度保持默认值6

printf "|%.10f|\n" 1.123456654321 ===》|1.1234566543|

#有点的时候,f前面的数字就是精度了,此时为10个精度

printf "|%10.5f|\n" 1.123456654321 ===》 | 1.12346|

#%10.5f 表示10个占位宽度,5个精度,不足用空格补齐

%g,%G

有效位数的最大数目

printf "|%10g|\n" 221.123456789123 ===》 | 221.123|

#没有点的时候,g前面的数字占位宽带,有效位数保持默认值6,不足用空格补齐
printf "|%.10g|\n" 221.123456789123 ===》|221.1234568|

#有点的时候,g前面的数字有效位数,而且取最后一位近似值

%s

要打印字符的最大数目

printf "|%10s|\n" 123456789ABCD ===》 |123456789ABCD|

printf "|%20s|\n" 123456789ABCD ===》| 123456789ABCD|

#没有点的时候,s前面的数字表示最小宽度,长度超过宽度值,会完全显示,
#长度未超过宽度值,会按照宽度值显示

printf "|%.10s|\n" 123456789ABCD ===》 |123456789A|

printf "|%.10s|\n" 123456 ===》 |123456|

#有点的时候,s前面的数字10表示最大宽度,最多显示10个字符
#当字符串长度超过10的时候,只显示10个字符
#当字符串长度不超过10的时候,则只显示字符串

printf "|%5.1s|\n" shell ===> | s|

]# printf "|%5.4s|\n" shell ===> | shel|

#%5.1s表示,最少5个占位符,.1表示打印前1个字符,打印出的字符串长度小于占位符个数的,用空格补齐

2. 案例:

# format-string为双引号
printf "%d %s\n" 1 "abc"  --->  1 abc# 单引号与双引号效果一样 
printf '%d %s\n' 1 "abc"  --->  1 abc# 没有引号也可以输出,但是不识别\n
printf %s abcdef ----》abcdef
printf %s\n abc  ----》abcn   #没有引号,\n被不识别为换行符# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
]# printf %s abc def  ---> abcdef
]# printf "%s\n" abc def 
abc
def
]# printf "%s %s %s\n" a b c d e f g h i j
a b c
d e f
g h i
j# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
]# printf "%s and %d \n" and 0 ]# printf "|%-20s|%15s|%10.2f|\n" "Shan" "zhang" 35
|Shan                |          zhang|     35.00|
分析:
%-20s表示一个左对齐、宽度为20个字符字符串格式,不足20个字符,右侧补充相应数量的空格符。
%15s表示一个右对齐、宽度为15个字符字符串格式,不足15个字符,左侧补充相应数量的空格符。
%10.2f表示右对齐、10个字符长度的浮点数,其中一个是小数点,小数点后面保留两位。printf "|%x|%#x|\n" 15 15
|f|0xf|
分析:如果#标志和%x,%X搭配使用,在输出十六进制数字时,前面会加0x或者0X前缀.

这篇关于shell printf详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081130

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

LabVIEW FIFO详解

在LabVIEW的FPGA开发中,FIFO(先入先出队列)是常用的数据传输机制。通过配置FIFO的属性,工程师可以在FPGA和主机之间,或不同FPGA VIs之间进行高效的数据传输。根据具体需求,FIFO有多种类型与实现方式,包括目标范围内FIFO(Target-Scoped)、DMA FIFO以及点对点流(Peer-to-Peer)。 FIFO类型 **目标范围FIFO(Target-Sc

019、JOptionPane类的常用静态方法详解

目录 JOptionPane类的常用静态方法详解 1. showInputDialog()方法 1.1基本用法 1.2带有默认值的输入框 1.3带有选项的输入对话框 1.4自定义图标的输入对话框 2. showConfirmDialog()方法 2.1基本用法 2.2自定义按钮和图标 2.3带有自定义组件的确认对话框 3. showMessageDialog()方法 3.1

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

OmniGlue论文详解(特征匹配)

OmniGlue论文详解(特征匹配) 摘要1. 引言2. 相关工作2.1. 广义局部特征匹配2.2. 稀疏可学习匹配2.3. 半稠密可学习匹配2.4. 与其他图像表示匹配 3. OmniGlue3.1. 模型概述3.2. OmniGlue 细节3.2.1. 特征提取3.2.2. 利用DINOv2构建图形。3.2.3. 信息传播与新的指导3.2.4. 匹配层和损失函数3.2.5. 与Super