shell中printf输出

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"

 

printf格式指定符
修饰符含义
-左对齐
Width 域的步长,0表示0步长
.prec最大字符串长度,或小数点左边的位数
%bprintf会解释参数字符串里的转义序列
%cASCII字符
%d,%i十进制整数
%e浮点数,科学计数法,如12.3 x 10e4 #浮点格式([-d].precisionE [+-dd])
%f浮点数,123.456
%gawk决定使用哪种浮点数转换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

 

 

printf标志
字符意义
-将字段里已格式化的值向左对齐
空格(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
--------------

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值