1 | printf
|
2 | ===
|
3 |
|
4 | 格式化并输出结果。
|
5 |
|
6 | ## 目录
|
7 |
|
8 | - [bash内建命令](#内建命令)
|
9 | - [GNU coreutils中的命令](#外部命令)
|
10 |
|
11 | ## 内建命令
|
12 |
|
13 | #### 概要
|
14 |
|
15 | ```shell
|
16 | printf [-v var] format [arguments]
|
17 | ```
|
18 |
|
19 | #### 主要用途
|
20 |
|
21 | - 格式化参数并输出。
|
22 |
|
23 | #### 选项
|
24 |
|
25 | ```shell
|
26 | -v var:将结果输出到变量var中而不是输出到标准输出。
|
27 | ```
|
28 |
|
29 | #### 参数
|
30 |
|
31 | format:输出格式。
|
32 |
|
33 | arguments:一到多个参数。
|
34 |
|
35 | ```shell
|
36 | 转义序列:除了支持printf(1)和printf(3)的转义序列,内建printf还支持以下转义序列:
|
37 |
|
38 | %b 展开参数中的反斜杠转义字符。
|
39 | %q 将参数扩起以用作shell输入。
|
40 | %(fmt)T 根据strftime(3)中的转义字符来输出日期时间字符串。
|
41 | ```
|
42 |
|
43 | #### 返回值
|
44 |
|
45 | 返回状态为成功除非给出了非法选项、写错误、赋值错误。
|
46 |
|
47 | #### 例子
|
48 |
|
49 | ```shell
|
50 | # %-5s 格式为左对齐且宽度为5的字符串代替('-'表示左对齐),不使用则默认右对齐。
|
51 | # %-4.2f 格式为左对齐宽度为4,保留两位小数。
|
52 |
|
53 | printf "%-5s %-10s %-4s\n" NO Name Mark
|
54 | printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456
|
55 | printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345
|
56 | printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323
|
57 |
|
58 | # 输出
|
59 | NO Name Mark
|
60 | 01 Tom 90.35
|
61 | 02 Jack 89.23
|
62 | 03 Jeff 98.43
|
63 |
|
64 |
|
65 | # %b %q %(fmt)T 的例子。
|
66 | # see it again with a newline.
|
67 | printf "%s\n" 'hello world'
|
68 | # 展开换行符,和上面的结果一样。
|
69 | printf "%b" 'hello world\n'
|
70 |
|
71 | printf '%q\n' 'a b c'
|
72 | # 输出
|
73 | a\ b\ c
|
74 |
|
75 | # %z为时区,%n为换行符。
|
76 | printf "%(%F %T %z%n)T"
|
77 | # 输出
|
78 | 2019-09-10 01:48:07 +0000
|
79 | ```
|
80 |
|
81 | #### 注意
|
82 |
|
83 | 1. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。
|
84 |
|
85 |
|
86 | ## 外部命令
|
87 |
|
88 | #### 概要
|
89 |
|
90 | ```shell
|
91 | printf FORMAT [ARGUMENT]...
|
92 | printf OPTION
|
93 | ```
|
94 |
|
95 | #### 主要用途
|
96 |
|
97 | - 格式化参数并输出。
|
98 |
|
99 |
|
100 | #### 选项
|
101 |
|
102 | ```shell
|
103 | --help 显示帮助信息并退出。
|
104 | --version 显示版本信息并退出。
|
105 | ```
|
106 |
|
107 | #### 参数
|
108 |
|
109 | format:输出格式。
|
110 |
|
111 | arguments:一到多个参数。
|
112 |
|
113 | ```shell
|
114 | 在这里忽略了(%b %q),如果你安装的coreutils版本支持它们,那么请参考上面的例子。
|
115 | 支持的转义序列:
|
116 |
|
117 | \" 双引号
|
118 | \\ 反斜杠
|
119 | \a 响铃
|
120 | \b 退格
|
121 | \c 截断输出
|
122 | \e 退出
|
123 | \f 翻页
|
124 | \n 换行
|
125 | \r 回车
|
126 | \t 水平制表符
|
127 | \v 竖直制表符
|
128 | \NNN 八进制数 (1到3位数字)
|
129 | \xHH 十六进制数 (1到2位数字)
|
130 | \uHHHH Unicode字符附加4位十六进制数字
|
131 | \UHHHHHHHH Unicode字符附加8位十六进制数字
|
132 | %% 百分号
|
133 |
|
134 | 以及'diouxXfeEgGcs'中的一个结尾的C格式规范,将被转换为正确的类型并处理可变宽度。
|
135 | ```
|
136 |
|
137 | #### 例子
|
138 |
|
139 | ```shell
|
140 | # 使用 /usr/bin/printf 确保调用的不是内建命令。
|
141 | # 当然,在你关闭内建printf以及确认当前环境没有printf函数的情况下,可直接使用printf,详见末尾"注意"的链接。
|
142 |
|
143 | # 按行打印数组和关联数组的下标及值。
|
144 |
|
145 | # 声明数组可以不加'declare -a'或'local -a'(在函数内声明的局部变量)。
|
146 | arr=('line1' 'line2')
|
147 | /usr/bin/printf "%s\n" ${!arr[@]}
|
148 | # 输出下标
|
149 | 0
|
150 | 1
|
151 | /usr/bin/printf "%s\n" ${arr[@]}
|
152 | # 输出值
|
153 | line1
|
154 | line2
|
155 |
|
156 | #声明关联数组(也就是字典)必须加'declare -A'或'local -A'(在函数内声明的局部变量)。
|
157 | declare -A assoc_arr=(['key1']='value1' ['key2']='value2')
|
158 | /usr/bin/printf "%s\n" ${!assoc_arr[@]}
|
159 | # 输出键。
|
160 | key2
|
161 | key1
|
162 | /usr/bin/printf "%s\n" ${assoc_arr[@]}
|
163 | # 输出值。
|
164 | value2
|
165 | value1
|
166 | ```
|
167 |
|
168 | #### 返回值
|
169 |
|
170 | 返回状态为成功除非给出了非法选项等。
|
171 |
|
172 | #### 注意
|
173 |
|
174 | 1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 printf`或`info coreutils 'pwd invocation'`。
|
175 |
|
176 | 2. 启动或关闭内建命令请查看`enable`命令,关于同名优先级的问题请查看`builtin`命令的例子部分的相关讨论。
|
177 |
|
178 | 3. 我通过和`bug-bash@gnu.org`的交流,得到了关于这几个格式说明符`%b %q %(fmt)T`的解释:
|
179 | > printf(1)中的%b格式说明符是printf(3)支持的格式之外增加的一个POSIX特性。
|
180 | >
|
181 | > %q和%T说明符是非标准的,并且不受所有独立实现的printf的支持。
|
182 |
|
183 | 更多细节请参考链接:
|
184 | - [POSIX printf](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html)
|
185 | `APPLICATION USAGE`段落的第五节。
|
186 | - [POSIX printf格式说明符](https://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html)
|
187 | 的`Description`段落。
|
188 |
|
189 |
|