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
[oper@devfz.cn ~]$ printf "打印小数: %f\n" 70.897
打印小数: 70.897000
[oper@devfz.cn ~]$ printf "打印小数(4舍5入保留2位小数): %.2f\n" 70.897
打印小数(4舍5入保留2位小数): 70.90
[oper@devfz.cn ~]$ 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 ~]$