shell printf格式化输出

shell也可以优雅的输出。

用法

1
printf: usage: printf [-v var] format [arguments]

参数

常用格式控制符

格式符 说明
%s 字符串
%d,%i 十进制整数
%u 不带正负号的十进制值
%o 不带正负号的八进制值
%x 不带正负号的十六进制值,使用a至f表示10至15
%X 不带正负号的十六进制值,使用A至F表示10至15
%e,%E,%f 浮点格式
%g %e或%f转换,看哪一个较短,则删除结尾的零
%G %E或%f转换,看哪一个较短,则删除结尾的零
%b 相对应的参数被视为含有要被处理的转义序列之字符串
%c ASCII字符。显示相对应参数的第一个字符
%% 字面意义的%

常用转义序列

格式符 说明
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
\ 一个字面上的反斜杠字符
\ddd 表示1到3位数八进制值的字符,仅在格式字符串中有效
\0ddd 表示1到3位的八进制值字符

使用场景举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# cat printf.sh
#!/bin/bash
printf "%-20s\t%-30s\n" "格式符" "说明"
printf "%-20s\t\033[33m%-30s\033[0m\n" '%s' '字符串'
printf '%-20s\t%-30s\n' '%d' '十进制整数'
printf "%-20s\t%-30s\n" "%u" '不带正负号的十进制值'
printf "%-20s\t%-30s\n" "%o" "不带正负号的八进制值"
printf "\033[32m%-20s\033[0m\t%-1.15f\n" %f 3.14159265358

# sh printf.sh
格式符 说明
%s 字符串
%d 十进制整数
%u 不带正负号的十进制值
%o 不带正负号的八进制值
%f 3.141592653580000

说明

  • 默认printf没有换行,需要手动添加\n;
  • %-20s指一个宽度为20的左对齐字符。如果不满20个字符则以空格填充,如超出20个字符也会显示所有内容;
  • -表示左对齐,+或者空则表示右对齐;
  • %-1.15f 格式化小数,其中.15指保留15位小数,不足位数补零;
  • 在格式控制符和输出字符串中单引号与双引号效果相同,但是不能将所有的输出字符串用一个引起来,必须每个字段一对引号;
  • 格式控制中也可以引入字体颜色。