printf 命令模仿 C 程序库(library)里的 printf() 程序。
printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
格式:printf format-string [arguments...]
格式:printf 控制格式的字符串 参数
printf "hello world\n"
第一部分为描述格式规格的字符串,用来描述输出的排列方式,最好为此字符串加上引号。此字符串包含按字面显示的字符以及格式声明,格式声明时特殊的占位符,用来描述如何显示相应的参数。
第二部分是与格式声明相对应的参数列表,例如一系列的字符串或变量值。格式声明由两部分组成:百分比符号(%)和指示符。最常用的格式指示符有两个,%s用于字符串,而%d用于十进制整数。格式字符串中,一般字符会按字面显示。转义序列则像echo那样,解释后再输出成相应的字符。格式声明以%符号开头,并以定义的字母集中的一个来结束,用来控制相应参数的输出。
需一一对应
注:1、默认情况下,转义序列只在格式字符串中会被特别对待,如果转义序列出现在参数列表的字符串中,将不会被解释:
printf "Hello <%s>\n" "World\n!" #后面的换行符并未转义,而是被当作字符串输出了
2、无论时在格式字符串内还是在使用%b所打印的参数字符串里,大部分的转义序列都是被相同对待。
printf "Hello <%b>\n" "World\n!" #使用%b时,字符串里面的则会转义(大部分)
无论如何,\c与\0ddd只有搭配%b使用才有效,而\ddd只有在格式字符串里才会被解释。
例子:
1、后面参数会根据 控制格式进行列输出
#printf "数字:%s\n" 0 1 2 3 4 5 6 7 8 9 # printf "数字:%s %s \n" 0 1 2 3 4 5 6 7 8 9
2、\b就是转义参数里面的转义符也进行转义,不加\b,参数中的转义符会根据普通字符串进行处理
#printf "%s\n" "123" "4\n56" "789" #printf "%b\n" "123" "4\n56" "789"
3、\c是用来忽略本参数c后面所有参数的,(必须配合\b使用,且这个参数时由\b进行处理的,否则会按普通字符串进行处理)
#printf "%s %s\n" "12\c3" "45\c6" "789\n" #printf "%s %b\n" "12\c3" "45\c6" "789\n"
4、\f效果 #printf "123\f456\f789\n"
5、\r的效果 #编写sh_printf_r.sh如下
#!/bin/bash
printf "111111111";
sleep 1;
printf "\r";
for (( i=6; i>0 ; i-- ))
do
printf "2";
sleep 1;
done;
printf "\r";
for (( i=3; i>0 ; i-- ))
do
printf "3";
sleep 1;
done
printf "\n"
printf命令可用来指定输出字段的宽度以及进行对其操作。为实现此目的,接在%后面的格式表达式可采用三个可选用的修饰符(modifier)以及前置的格式指示符(format specifier):
%flags width.precision format-specifier
输出字段的width为数字值。指定字段宽度时,字段的内容默认为向右对齐,如果你希望文字向左靠,必须指定-标志。这样:“%-20s”会在一个有20个字符宽度的字段里,输出一个向左对齐的字符串。如果字符串少于20个字符,则字段将以空白填满。下面的例子里,|是输出,以表示字段的实际宽度。
下一个例子则为向左对齐文字:
precision修饰符是可选用的。对十进制或浮点数值而言,它可以控制数字出现于结果中的位数。对于字符串值而言,它控制将要打印的字符串的最大字符数。具体的含义会因格式指示符而有不同,如下所示:
精度的意义
转换 精度含义
%d,%i,%o,%u,%x,%X 要打印的最小位数。当值的位数小于此数字时,会在前面补零。
默认精度(precision)为1
%e,%E 要打印的最小位数。当值的位数小于此数字时,会在小数点后面
补零,默认精度为6.精度为0时则表示不显示小数点
%f 小数点右边的位数
%g,%G 有效位数(significant digit)的最大数目
%s 要打印字符的最大数目
下面是几个精度的例子:
对于转换指示符%b,%c与%s而言,相对应的参数都视为字符串。否则,它们会被解释为C语言的数字常数(
以0开头的为八进制,以0x或0X开头的为十六进制)。更进一步的说,如果参数的第一个字符为单引号或
双引号,则相对应的数值是字符串的第二个字符的ASCII值:
序列 | 含义 |
\a | 警告 |
\b | 后退 |
\c | 抑制(不显示)输出结果中结尾的换行字符(指在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符,任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 |
\f | 换页(formeed) |
\n | 换行 |
\r | 回车(Carriage return) |
\t | 水平制表符 |
\v | 垂直制表符 |
\0NNN | 表示1到3位数八进制的字符,仅在格式字符串中有效 |
\xNNN | 同上,十六进制 |
\\ | printf "\\101\n" |
修饰符 | 含义 |
- | 左对齐 |
Width | 域的步长,0表示0步长 |
.prec | 最大字符串长度,或小数点左边的位数 |
%b | printf会解释参数字符串里的转义序列 |
%c | ASCII字符 |
%d,%i | 十进制整数 |
%e | 浮点数,科学计数法,如12.3 x 10e4 #浮点格式([-d].precisionE [+-dd]) |
%f | 浮点数,123.456 |
%g | awk决定使用哪种浮点数转换e或者f #%e或%f转换,看哪一个较短,则删除结尾的零 |
%o | 八进制数(不带正负号) |
%s | 字符串 |
%u | 十进制(不带正负号) |
%x | 十六进制 |
%% | % |
转换 | 精度含义 |
%d,%i, %o,%u,%x,%X | 要打印的最小位数.当值的位数少于此数字时,会在前面补零.默认精度为1 |
%e,%E | 要打印的最小位数.当值的位数少于此数字时,会在小数点后面补零,默认为精度为6.精度为0则表示不显示小数点小数点右边的位数 |
%f | 小数点右边的位数 |
%g,%G | 有效位数的最大数目 |
%s | 要打印字符的最大数目 |
1、printf "%.5d\n" 15
输出:00015
2、 printf "%.10s\n" "a very long string"
输出:a very lon
3、 printf "%.2f\n" 123.4567 #四舍五入
输出:123.46
字符 | 意义 |
- | 将字段里已格式化的值向左对齐 |
空格(space) | 在正值前置一个空格,在负值前置一个负号 |
+ | 总是在数值之前放置一个正号或负号,即便是正值也是 |
# | 下列形式选择其一:%o有一个前置的o;%x与%X分别前置的0x与0X.%e,%E与%f总是在结果中有一个小数点;%g与%G为没有结尾的零. |
0 | 以零填补输出,而非空白.这仅发生在字段宽度大于转换后的情况.在C语言里,该标志应用到所有输出格式,及时是非数字的值也是一样.对于printf命令而言,它仅应用到数值格式 |
1、printf "%-10s%-5s%10.2fkg\n" "张三" "男" 70
输出:张三 男 70.00kg
%-10s表示一个左对齐、宽度为10个字符字符串格式,不足20个字符,右侧补充相应数量的空格符。
%-5s表示一个左对齐、宽度为5个字符字符串格式。
%10.2f表示右对齐、10个字符长度的浮点数,其中一个是小数点,小数点后面保留两位。
2、printf "|%10s|\n" hello 和 printf "|%-10s|\n" hello
右对齐和左对齐,不足的以空格补齐
3、printf "%x || %#x\n" 15 15
输出:f || 0xf
#如果#标志和%x,%X搭配使用,在输出十六进制数字时,前面回家0x或者0X前缀.
使用标志符的作用主要是为了动态的指定宽度和精度.
对于转换指示符%b,%c与%s而言,相对应的参数都是为字符串.否则,他们会被解释为C语言的数字常数(开头的0位八进制,以及开头的0x与0X为十六进制).更进一步说,如果参数的第一个字符为单引号或双引号,则县桂英的数值是字符串的第二个字符的ASCII值:
4、命令:printf "%s is %d \n" a "'a"
输出:a is 97
当参数多于格式指示符时,格式指示符会根据需要再利用.这种做法在参数列表长度未知时时很方便的,例如来自通配符表达式.如果留在格式字符串里剩下的指示符比参数多时,如果是数值转换,则遗漏的值会被看做是零,如果是字符串转换,则被视为空字符串(虽然可以这么用,但比较好的方式应该是一一对应关系,即提供的参数数目和格式字符串数目相同).如果printf无法进行格式的转换,便返回一个非零的退出状态.
转载至:https://blog.csdn.net/iteye_6429/article/details/82141155
https://blog.csdn.net/shanyongxu/article/details/46744055
--------------