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[oper@devfz.cn ~]$

1.上面代码中,最后一句为格式化输出,且未打印换行的效果
2.echo命令默认是行尾输出换行符的,而printf默认不换行

格式化输出


format-string 完全格式:

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

示例:

[oper@devfz.cn ~]$ printf "数字:%s %s\n" 1 2
数字:1 2
[oper@devfz.cn ~]$ printf "数字:%04d %s\n" 1 2
数字:0001 2
[oper@devfz.cn ~]$ printf "数字:%-4s %s\n" sb xy
数字:sb   xy
[oper@devfz.cn ~]$ printf "数字:%4s %s\n" sb xy
数字:  sb xy

flags标志符

flag意义
-左对齐。如:%-10s,表示格式化为10个字符的字符串,长度不足则右补空格.默认是右对齐
空格(space)在正数前置一个空格,在负值前置一个负号
+在正数前置一个加号,负值忽略
0以长度不足时用零填补输出,仅应用到数值格式。如%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是两位十六进制数

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

[oper@devfz.cn ~]$ printf "数字:%s \n" 1 2 34 
数字:1 
数字:2 
数字:34 
[oper@devfz.cn ~]$ printf "数字:%s %s\n" 1 2 34 
数字:1 2
数[oper@devfz.cn ~]$ printf "数字:%d , %d,%d\n" 88 6
数字:88 , 6,0
[oper@devfz.cn ~]$ printf "数字:%d , %d,%s\n" 88 6
数字:88 , 6,

指定打印宽度示例:

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

数字打印示例:

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

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

[oper@devfz.cn ~]$ printf "打印8进制: %o \n前导: %#o \n" 255 255 
打印8进制: 377 
前导: 0377

[opedevfz.cn96 ~]$ printf "打印小数: %f\n" 70.897
打印小数: 70.897000

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

devfz.cntest96 ~]$ printf "打印科学计数法: %e\n" 70.897
打印科学计数法: 7.089700e+01devfz.cnr@test96 ~]$ printf "打印科学计数法(保留2位小数): %.2e\n" 70.897
打印科学计数法(保留2位小数): 7.09e+01

转义序列示例:

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

[oper@devfz.cn ~]$

转载至:http://devfz.cn/book/shell/linux-shell-printf.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值