天天看点

shell printf命令详解

作者:猿界

printf命令用于格式化并打印字符到标准输出,类似c语言的printf(),它由POSIX标准所定义,因此它比 echo命令移植性更好。

语法:

printf [-v var] format-string [arguments...]           

参数说明:

  • -v var 表示的是将输出赋值给shell变量VAR而不是在标准输出中显示它
  • format-string: 格式控制字符串,由普通字符、转义序列和格式指定符组成
  • arguments: 参数列表,用于替换格式控制字符串中的变量或占位符的内容

示例:

$ echo "Hello world"  
Hello world  

$ printf "Hello, printf\n"  
Hello, printf  

$ printf "Hello %s,my love" baby
Hello baby,my love[[email protected] ~]$           

1.上面代码中,最后一句为格式化输出,且未打印换行的效果

2.echo命令默认是行尾输出换行符的,而printf默认不换行

格式化输出

format-string 完全格式:

%[flags] [width.precision] format-specifier           
  • %表示后面是格式控制字符
  • flags标志符,可省略,主要用于控制补齐等,详见下表
  • width.precision,宽度或精度指定
  • format-specifier,格式指定符,详见下表

示例:

[[email protected] ~]$ printf "数字:%s %s\n" 1 2
数字:1 2
[[email protected] ~]$ printf "数字:%04d %s\n" 1 2
数字:0001 2
[[email protected] ~]$ printf "数字:%-4s %s\n" sb xy
数字:sb   xy
[[email protected] ~]$ printf "数字:%4s %s\n" sb xy
数字:  sb xy           

flags标志符

flag 意义
- 左对齐。如:%-10s,表示格式化为10个字符的字符串,长度不足则右补空格.默认是右对齐
空格(space) 在正数前置一个空格,在负值前置一个负号
+ 在正数前置一个加号,负值忽略
以长度不足时用零填补输出,仅应用到数值格式。如%05d
# 改变格式数字,如%x会加前导0x,%o加前导0, %b加前导0b

format-specifier 格式指定符

符号 描述
%s 以字符串的格式打印相关参数
%d,%i 以带符号十进制数的格式打印相关参数
%b 解释参数字符串里的转义序列
%q 以 Shell 引用的格式打印相关参数,使其可以在标准输入中重用
%o 以无符号八进制数的格式打印相关参数
%u 以无符号十进制数的格式打印相关参数
%x,%X 以无符号小写十六进制数的格式打印相关参数,%X打印为大写字母
%f 以浮点数的格式解析并打印相关参数
%e,%E 将参数打印为指数表示法的浮点数。%E打印为大写字母
%g,%G 以正常或指数表示法将参数打印为浮点数,以更适合给定值和精度的表示法为准。%g打印大写字母
%c 以字符的格式打印相关参数,并且只打印参数中的第一个字符
%% 打印一个“%”字符

转义序列

转义符 说明
\a 警告音,通常为ASCII的BEL字符
\b 后退
\c 取消输出行末换行符
\f 换页
\n 换行
\r 回车
\t 水平制表符 即tab
\v 垂直制表符
\ 一个字面上的反斜杠字符
\ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd 表示1到3位的八进制值字符
\xhh 按照十六进制ASCII码表输出字符,其中hh是两位十六进制数

格式指定符与参数个数不匹配的情况示例:

[[email protected] ~]$ printf "数字:%s \n" 1 2 34 
数字:1 
数字:2 
数字:34 
[[email protected] ~]$ printf "数字:%s %s\n" 1 2 34 
数字:1 2
数[[email protected] ~]$ printf "数字:%d , %d,%d\n" 88 6
数字:88 , 6,0
[[email protected] ~]$ printf "数字:%d , %d,%s\n" 88 6
数字:88 , 6,           

指定打印宽度示例:

[[email protected] ~]$ printf "数字左补0:%05d\n" 8
数字左补0:00008
[[email protected] ~]$ printf "数字左补0:%.5d\n" 8
数字左补0:00008
[[email protected] ~]$ printf "数字左补空格:%5d\n" 8
数字补空格:    8
[[email protected] ~]$ printf "字符补右空格:%-5s右侧|" s
字符补右空格:s    |
[[email protected] ~]$ printf "字符右补空格:%5s\n" s
字符左补空格:    s           

数字打印示例:

# 字母前带单或双引号
[[email protected] ~]$ printf "打印字母s的ASCII值:%d \n" "'s"
打印字母s的ASCII值:115 

[[email protected] ~]$ printf "打印16进制\n小写: %x \n大写: %X \n带ox前导: %#x \n" 255 255 255
打印16进制
小写: ff 
大写: FF 
带ox前导: 0xff

[[email protected] ~]$ printf "打印8进制: %o \n前导: %#o \n" 255 255 
打印8进制: 377 
前导: 0377

[[email protected] ~]$ printf "打印小数: %f\n" 70.897
打印小数: 70.897000

[[email protected] ~]$ printf "打印小数(4舍5入保留2位小数): %.2f\n" 70.897
打印小数(4舍5入保留2位小数): 70.90

[[email protected] ~]$ printf "打印科学计数法: %e\n" 70.897
打印科学计数法: 7.089700e+01
 
[[email protected] ~]$ printf "打印科学计数法(保留2位小数): %.2e\n" 70.897
打印科学计数法(保留2位小数): 7.09e+01           

转义序列示例:

[[email protected] ~]$ printf "转义序列,换行\n制表符\t\t|非空白\n" 
转义序列,换行
制表符        |非空白
[[email protected] ~]$ printf "转义序列,%s新行%s\n" 3\n "3\n"  
转义序列,3n新行3\n
[[email protected] ~]$ printf "转义序列,%b新行%b\n" 3\n "3\n"  
转义序列,3n新行3

[[email protected] ~]$