本文主要是介绍shell printf详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
默认的 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
1. printf命令语法组成:
printg format-string [arguments]
第一部分为格式化字符串,该字符串最好用引号括起来
第二部分为参数列表,例如字符串或变量值的列表,该列表需与第一个参数格式相对应.
1.1. format参数
参数 | 含义 | 举例 |
%b | 打印相关内容并解释其中反斜杠"\"的特殊字符 | printf "|%b|\n" "a\tb" ---> |a b| |
%c | 输出一个字符 | printf "|%c|\n" abc ---> |a| |
%q | 以shell引用的格式打印相关内容,使其可以在标准输入中重用 | |
%d | 以带符号十进制的格式打印相关内容 | printf "%d\n" 20 ---> 20 |
%i | 与%d相同 | printf "%i\n" 20 ---> 20 |
%o | 以无符号八进制格式打印相关内容 | printf "%o\n" 20 ---> 24 |
%u | :以无符号十进制格式打印相关内容 | printf "%u\n" 20 ---> 20 |
%x | 以无符号小写十六进制打印相关内容 | printf "%x\n" 20 ---> 14 |
%X | 以无符号大写十六进制打印相关内容 | printf "%X\n" 20 ---> 14 |
%f | 以浮点数的格式解析并打印相关内容 | printf "|%f|\n" 2.2 ---> |2.200000| |
%e | 以用科学记数法(e 记数法)表示的浮点数 | printf "|%e|\n" 2.2 ---> |2.200000e+00| |
%E | 与%e相同,只是字母用大写 | printf "|%E|\n" 2.2 ---> |2.200000E+00| |
%g | 选用e或f中较短的一种形式 | printf "|%g|\n" 2.2 ---> |2.2| |
%G | 以%f或者%e格式打印相关内容 | printf "|%G|\n" 2.2 ---> |2.2| |
%s | 以字符串的格式打印相关内容 | printf "|%s|\n" "a\tb" ---> |a\tb| |
%n | 指定打印字符的个数 | printf "|%4s|\n" "abc" ---> | abc| |
%% | %字符 | printf "|%d%%|\n" 100 ---> |100%| |
1.2. printf标志字符
printf标志字符 | 含义 | 举例 |
- | 将字段里已格式化的值向左对齐 | printf "|%5d|\n" 1 ===> | 1| 对比 printf "|%-5d|\n" 1 ===》 |1 | |
空格 | 在正值前置一个空格,在负值前置一个负号 | printf "|%d|\n" 20 ===》 |20| 对比 printf "|% d|\n" 20 ===》| 20| printf "|%d|\n" -20 ===》|-20| 对比 printf "|% d|\n" -20 ===》|-20| |
+ | 总是在数值之前放置一个正号或负号,即便是正值也是 | printf "%+d\n" 20 ===》 +20 对比 printf "%d\n" 20 ===》20 printf "%+d\n" -20 ===》 -20 对比 printf "%d\n" -20 ===》-20 |
# | 用于8进制%o时,会使字符前面多个0 用于16进制%x,%X时,会使字符前面多个0X 用于%e,%E与%f,总是在结果中有一个小数点; %g与%G为没有结尾的零. | printf "%o\n" 20 ===》 24 对比 printf "%#o\n" 20 ===》 024 printf "%x\n" 20 ===》 14 对比 printf "%#x\n" 20 ===》 0x14 printf "%g\n" 1.123 ===》1.123 对比 printf "%#g\n" 1.123 ===》 1.12300 |
0 | 以零填补输出,而非空白.这仅发生在字段宽度大于转换后的情况. | printf "|%5d|\n" 1 ===》 | 1| 对比 printf "|%05d|\n" 1 ===》|00001| |
1.3. format转义符
转义序列只在格式字符串中会被特别对待,也就是说,出现在参数字符串里的专利序列不会被解释:
使用命令:printf "%s\n" "abc\ndef"
输出结果:abc\ndef
转义符 | 含义 | 举例 |
\" | 打印"符号 | printf "|%s\"|\n" "abc" ---> |abc"| |
\NNN | 用八进制的值表示一个ASCII字符 | printf "|\141|\n" ---> |a| |
\\ | 打印\符号 | printf "|%s\\|\n" "abc" ---> |abc\| |
\a | 发出警告声 | |
\b | 向前删除一个字符 | printf "|%s\b|\n" "abc" ---> |ab| |
\f | 换页符,在某些实现中会清屏,有些会换行 | |
\n | 换行符 | |
\r | 不换行,光标在行首 | |
\t | 制表符 | printf "|%s\t|\n" abc ---> |abc | |
\v | 垂直制表符 | |
\xHH | 用十六进制的值表示一个ASCII字符 | printf "|\x61|\n" ---> |a| |
1.4. 精度的含义
精度的含义 | ||
转换 | 精度含义 | 举例 |
%d,%i,%o,%u,%x,%X | 要打印的最小位数. 当值的位数少于此数字时, 会在前面补零.默认精度为1 | printf "|%5d|\n" 1000 ==》 | 1000| #没有点的时候,d前面的数字5表示宽度,字符长度不足5的,右对齐,不足用空格补齐 #有点的时候,d前面的数字表示宽度 |
%e,%E | 要打印的最小位数. 当值的位数少于此数字时, 会在小数点后面补零,默认为精度为6. 精度为0则表示不显示小数点右边的位数 | printf "|%.5e|\n" 2214.123456 ===》|2.21412e+03| #精度5,长度够,不补0 printf "|%20e|\n" 222 ===> | 2.220000e+02| #没有点的时候,20代表占位宽带,精度保持默认值6,右对齐,不足用空格补齐 printf "|%.0e|\n" 222 ===》 |2e+02| #精度为0,不显示小数点右边的位数 ------------------------------------------ printf "%e\n" 1.123456654321 ===》1.123457e+00 #没有.的时候,无论e前面有没有数字,小数点后面都只保留6位,而且取最后一位近似值 ------------------------------------------ |
%f | 小数点右边的位数 | printf "|%10f|\n" 1.123456654321 ===》 | 1.123457| printf "|%.10f|\n" 1.123456654321 ===》|1.1234566543| #有点的时候,f前面的数字就是精度了,此时为10个精度 printf "|%10.5f|\n" 1.123456654321 ===》 | 1.12346| #%10.5f 表示10个占位宽度,5个精度,不足用空格补齐 |
%g,%G | 有效位数的最大数目 | printf "|%10g|\n" 221.123456789123 ===》 | 221.123| #没有点的时候,g前面的数字占位宽带,有效位数保持默认值6,不足用空格补齐 #有点的时候,g前面的数字有效位数,而且取最后一位近似值 |
%s | 要打印字符的最大数目 | printf "|%10s|\n" 123456789ABCD ===》 |123456789ABCD| printf "|%20s|\n" 123456789ABCD ===》| 123456789ABCD| #没有点的时候,s前面的数字表示最小宽度,长度超过宽度值,会完全显示, printf "|%.10s|\n" 123456789ABCD ===》 |123456789A| printf "|%.10s|\n" 123456 ===》 |123456| #有点的时候,s前面的数字10表示最大宽度,最多显示10个字符 printf "|%5.1s|\n" shell ===> | s| ]# printf "|%5.4s|\n" shell ===> | shel| #%5.1s表示,最少5个占位符,.1表示打印前1个字符,打印出的字符串长度小于占位符个数的,用空格补齐 |
2. 案例:
# format-string为双引号
printf "%d %s\n" 1 "abc" ---> 1 abc# 单引号与双引号效果一样
printf '%d %s\n' 1 "abc" ---> 1 abc# 没有引号也可以输出,但是不识别\n
printf %s abcdef ----》abcdef
printf %s\n abc ----》abcn #没有引号,\n被不识别为换行符# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
]# printf %s abc def ---> abcdef
]# printf "%s\n" abc def
abc
def
]# printf "%s %s %s\n" a b c d e f g h i j
a b c
d e f
g h i
j# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
]# printf "%s and %d \n" and 0 ]# printf "|%-20s|%15s|%10.2f|\n" "Shan" "zhang" 35
|Shan | zhang| 35.00|
分析:
%-20s表示一个左对齐、宽度为20个字符字符串格式,不足20个字符,右侧补充相应数量的空格符。
%15s表示一个右对齐、宽度为15个字符字符串格式,不足15个字符,左侧补充相应数量的空格符。
%10.2f表示右对齐、10个字符长度的浮点数,其中一个是小数点,小数点后面保留两位。printf "|%x|%#x|\n" 15 15
|f|0xf|
分析:如果#标志和%x,%X搭配使用,在输出十六进制数字时,前面会加0x或者0X前缀.
这篇关于shell printf详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!