将字符串格式化输出
选项 | 说明 |
---|---|
%s | 字符串 |
%f | 浮点型 |
%b | 相对应参数中包含转义字符时,可以使用此替换符进行替换,对应的转义字符被转义。 |
%c | ASCII字符,显示想对应参数的第一个字符。 |
%d | %i 十进制整数 |
%o | 不带正负号的八进制值 |
%u | 不带正负号的十进制值 |
%x | 不带正负号的十六进制值,使用a至f表示10到15 |
%X | 不带正负号的十六进制值,使用A至F表示10到15 |
%% | 表示 % 本身 |
转义字符 | 说明 |
---|---|
\a | 警告字符,通常为ASCII的BEL字符 |
\b | 后退 |
\c | 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ | 一个字面上的反斜杠字符,即 \ 本身 |
\ddd | 表示1到3位数八进制值的字符。仅在格式字符串中有效 |
\0ddd | 表示1到3位的八进制值字符 |
示例
## 将每一个传入的参数两边添加括号,并且括号内测需要有空格
[root@dm ~]# printf "( %s )" 1 5 12;echo ""
( 1 )( 5 )( 12 )
## 将每个传入的参数用制表符隔开
[root@dm ~]# printf "%s\t" 1 2 13;echo ""
1 2 13
## 如果我们在格式中使用多个格式替代符。那么指定格式中包含格式替代符的数量,就是每次格式参数的数量。
[root@dm ~]# printf "%s\n" a b c d e f
a
b
c
d
e
f
[root@dm ~]# printf "%s %s\n" a b c d e f
a b
c d
e f
[root@dm ~]# printf "%s%s\n" a b c d e f
ab
cd
ef
每次格式化时传入两个参数。前一个参数对应第一个替代符,后一个参数对应第二个替代符。
## 在原来的格式替代符中加入数字,如%7s表示当前替换符对应的输出宽度为7个字符。如果对应的输出不满七个字符,则用空格补全,如果输出长度超过七个字符,超出部分也会显示。这些数字被称作修饰符,修饰符对相应的替换符进行修饰。
[root@dm ~]# printf "%s %s %s\n" 姓名 性别 年龄 小明 男 23 小红 女 25
姓名 性别 年龄
小明 男 23
小红 女 25
[root@dm ~]# printf "%7s %5s %4s\n" 姓名 性别 年龄 小明 男 23 小红 女 25姓名 性别 年龄小明 男 23小红 女 25
[root@dm ~]# printf "%-7s %-5s %-4s\n" 姓名 性别 年龄 小明 男 23 小红 女 25
姓名 性别 年龄
小明 男 23
小红 女 25
## 其中 - 也是修饰符表示左对齐,默认不加 - 表示右对齐。还有一个修饰符 + 但是+不表示右对齐。在使用修饰符时,显示正数前面的正号。示例如下:
[root@dm ~]# printf "灵宠名称 体温\n";printf "%10s %5d\n" 烈火兽 180 冰晶兽 -70
灵宠名称 体温烈火兽 180冰晶兽 -70
[root@dm ~]# printf "灵宠名称 体温\n";printf "%10s %+5d\n" 烈火兽 180 冰晶兽 -70
灵宠名称 体温烈火兽 +180冰晶兽 -70
## 数字修饰符还有一种特殊用法
[root@dm ~]# printf "灵宠名称 体温\n";printf "%10s %+12f\n" 烈火兽 180.23443 冰晶兽 -70.3425
灵宠名称 体温烈火兽 +180.234430冰晶兽 -70.342500
[root@dm ~]# printf "灵宠名称 体温\n";printf "%10s %+12.3f\n" 烈火兽 180.23443 冰晶兽 -70.3425
灵宠名称 体温烈火兽 +180.234冰晶兽 -70.342
## 当替换符为%f时,如果数字修饰符带有小数点。则小数点后边的数字表示对应的小数精度。当替换符为%d时,则数字修饰符小数点后的数字表示整数的长度,长度不够时高为用0补全
[root@dm ~]# printf "灵宠名称 体温\n";printf "%10s %+12.5d\n" 烈火兽 180 冰晶兽 -70
灵宠名称 体温烈火兽 +00180冰晶兽 -00070
## 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
[root@dm ~]# printf "%s and %d \n" and 0
[root@node1 shell]# for i in {1..10};do printf "%.5d%s\n" ${i} ; done
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010