本文共 3553 字,大约阅读时间需要 11 分钟。
-- Start
几乎所有的语言都支持 printf 函数,ksh 也不例外。下面我们来看一个简单的例子.
#!/bin/kshprintf "printf example:%,30.6f" 9876543210.0123456789;结果如下:
printf example: 9,876,543,210.012346%,30.6f 被称为格式符(format specifier), 格式符由以下几部分组成:
%[flags][width][.precision]conversion % , 30 .6 f
转换符 描述 d 十进制整数,也可进制转换 i 十进制整数 u 无符号十进制整数 e 浮点数科学计数法 E 浮点数科学计数法 f 浮点数 g %e 或 %f, 取决于哪个更短, 删除尾部0 G %E 或 %f, 取决于哪个更短, 删除尾部0 o 无符号八进制整数 x 无符号十六进制整数(a-f for 10 to 15) X 无符号十六进制整数(A-F for 10 to 15) c ASCII 字符 (打印第一个字符) % % s 字符串 b %s,支持更多的转义字符 H %s,转成 HTML 字符,如:空格转成 P %s,把 egrep 风格的正则表达式转成 ksh 风格 R %s,把 ksh 风格的正则表达式转成 egrep 风格 q %s,打印成 $'...' 风格 n 到字符串的长度 (date format)T 格式化日期
日期和时间转换符
转换符(Conversion) 描述(Description)Y 4位数字的年(前面补0)m 月,01-12d 日,01-31H 小时,00-23M 分钟,00-59S 秒,00-60I 小时,01-12N 纳秒,000000000 - 999999999P 本地敏感, PM or AMp 本地敏感,pm or amz 时区偏移量, 如 +0800Z 时区s 从格林威治时间1970-01-01 00:00:00起的秒数B 月的完整拼写b/h 月的缩写A 星期的完整拼写a 星期的缩写y 年的后两位数字(前面补0)C 年的前两位数字(前面补0)j 一年的第几天,001-366e 日,1-31R 24小时时间,如 18:05T 24小时时间,如 18:05:19r 12小时时间, 如 06:05:19 pmD 美国格式的日期(月/日/年),如 02/09/2004F ISO 8601 日期, 如 2004-02-09c 完整的日期和时间,如 Tue Oct 6 09:15:27 2015k 完整的日期和时间,如 Tue Oct 6 09:18:22 EDT 2015l 完整的日期和时间,如 Oct 6 09:19L 完整的日期和时间,如 Tue Oct 6 09:20:17 EDT 2015ksh 支持如下标志(flag)
标志 描述 举例- 左对齐 |3333.33 |空格 在正数之前添加空格 | 3333.33|,|-3333.33|+ 打印正负数符号 |+3333.33|,|-3333.33|0 数字前面补0 |003333.33|, 添加千分位 |3,333.33|#(对于%o) 添加前缀0 |0515|#(对于%x) 添加前缀0x |0x1bc|#(对于%X) 添加前缀0X |0X1bc|#(对于%e) 添加小数点 |1.000000e+01|#(对于%E) 添加小数点 |1.000000E+01|#(对于%f) 添加小数点 | 10.000000|#(对于%g) 不删除尾部0 |10.4000|#(对于%G) 不删除尾部0 |10.4000|ksh 精度(precision)的意义。
转换符 精度意义%d,%i,%o,%u,%x,%X 最少数字位数,如果数字位数少于精度,添加前缀0%e, %E 最少数字位数,如果数字位数少于精度,添加后缀0%f 小数的位数%g, %G 最多数字位数%s 字符位数
一些例子。
#!/bin/ksh# %b 同 %s,支持更多的转义字符printf "%b\n" 'hello\nworld';# %H 同 %s,转成 HTML 字符,如:空格转成 printf "%H\n" "Here are real < and > characters";# %P 同 %s,把 egrep 风格的正则表达式转成 ksh 风格printf "%P\n" '(.*\.o|.*\.obj|core)+';# %R 同 %s,把 ksh 风格的正则表达式转成 egrep 风格printf "%R\n" '+(*.o|*.c)';# %q 同 %s,打印成 $'...' 风格printf "print %q\n" "a string with ' and \" in it"# %d,进制转换printf '42 is %.3.5d in base 5\n' 42# %n 得到字符串的长度printf "hello, world\n%n" msglen;print $msglen;# %(date format)T, 格式化日期printf "%(It is now %Y-%m-%d %H:%M:%S)T\n" "$(date)"
-- 更多参见:
-- 声 明:转载请注明出处
-- Last Updated on 2015-10-06
-- Written by ShangBo on 2015-10-06 -- End