Chinaunix首页 | 论坛 | 博客
  • 博客访问: 583066
  • 博文数量: 88
  • 博客积分: 4769
  • 博客等级: 中校
  • 技术积分: 989
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-24 02:31
文章分类

全部博文(88)

文章存档

2012年(4)

2011年(35)

2010年(49)

分类:

2010-08-20 18:18:36

printf命令模仿C程序库(library)里的printf()库程序(library routine)。它几乎复制了

该函数的所有功能。不过在Shell层级的版本上,会有些差异。由于printf的行为是由POSIX

标准所定义,因此使用printf的脚本比使用echo移植性好。

如同echo命令,printf命令可以输出简单的字符串:

    $ printf “Hello, Shell\n”

你应该可以马上发现,最大的不同在于:printf不像echo那样会自动提供一个换行符号。你必须显式

地将换行符号指定成\n


printf命令的完整语法有两个部分:

printf format-string [arguments...]

第一部分为描述格式规格的字符串,用来描述输出的排列方式,最好为此字符串加上引号。此字符

串包含按字面显示的字符以及格式声明,格式声明时特殊的占位符,用来描述如何显示相应的参数。

第二部分是与格式声明相对应的参数列表,例如一系列的字符串或变量值。格式声明由两部分组成:

百分比符号(%)和指示符。最常用的格式指示符有两个,%s用于字符串,而%d用于十进制整数。


格式字符串中,一般字符会按字面显示。转义序列则像echo那样,解释后再输出成相应的字符。格

式声明以%符号开头,并以定义的字母集中的一个来结束,用来控制相应参数的输出。例如%s用于

字符串的输出:

    $printf “The first program always prints '%s, %s\n'” Hello Shell

当尝试以%d的格式来显示字符串Shell时,会发现有警告,提示Shell为无效的数字,此时会打印出

默认值0;从这个试验中可以看出来:%s, %s两侧的单引号''并不是必须的。


printf 的转义序列

序列                     说明

\a                        警告字符,通常为ASCIIBEL字符

\b                       后退

\c                       抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的

                         参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及

                         任何留在格式字符串中的字符,都被忽略

\f                      换页(formfeed

\n                     换行

\r                      回车(Carriage return

\t                      水平制表符

\v                     垂直制表符

\\                      一个字面上的反斜杠字符

\ddd                表示13位数八进制值的字符。仅在格式字符串中有效

\0ddd              表示13位的八进制值字符


默认情况下,转义序列只在格式字符串中会被特别对待,也就是说,如果转义序列出现在参数列表

的字符串中,将不会被解释:

$printf “a string, no processing: <%s>\n” “A\nB”

当你使用%b格式指示符时,printf会解释参数字符串里的转义序列:

$printf “a string, with processing: <%b>\n” “A\nB”


无论时在格式字符串内还是在使用%b所打印的参数字符串里,大部分的转义序列都是被相同对待。

无论如何,\c\0ddd只有搭配%b使用才有效,而\ddd只有在格式字符串里才会被解释。


现在来试试这些转义序列的效果

\a     警告字符,通常为ASCIIBEL字符

ASCII中的BEL代表的是beep,如果你在终端输入:

    $printf “test \a”

应该会听到一声beep。在我的电脑上前两天还能听到,今天测试时没有声音了,可能是系统的

设定有改变。


\b     后退

首先新建一个名为“sh_printf_b.sh”的文档,内容如下:

#! /bin/bash

printf "1";

sleep 1;

printf "\b";

sleep 1;

printf "2";

sleep 1;

printf "\b";

sleep 1;

printf "3";

sleep 1;

printf "\n"

其运行结果如下图所示:


\c    抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的

      参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及

      任何留在格式字符串中的字符,都被忽略

\c要与%b配合使用,请参考下图,其中%b两侧的尖括号并不是必须的:


\f                      换页(formfeed

在我系统上的效果如下:


\n                     换行  


\r                      回车(Carriage return

创建一个名为“sh_printf_r.sh”的文档,内容如下:

#! /bin/bash

printf "111111111";

sleep 1;

printf "\r";

printf "2";

sleep 1;

printf "2";

sleep 1;

printf "2";

sleep 1;

printf "2";

sleep 1;

printf "2";

sleep 1;

printf "2";

sleep 1;

printf "\r"

sleep 1;

printf "3";

sleep 1;

printf "3";

sleep 1;

printf "3";

sleep 1;

printf "\n"

其运行效果如下图所示:


\t                      水平制表符

\v                     垂直制表符

\\                      一个字面上的反斜杠字符


printf 格式指示符

项目     说明

%b          相对应的参数被视为含有要被处理的转义序列之字符串。

%c           ASCII字符。显示相对应参数的第一个字符

%d, %i    十进制整数

%e          浮点格式

%E          浮点格式

%f           浮点格式

%g          %e%f转换,看哪一个较短,则删除结尾的零

%G          %E%f转换,看哪一个较短,则删除结尾的零

%o           不带正负号的八进制值

%s           字符串

%u          不带正负号的十进制值

%x          不带正负号的十六进制值,使用af表示1015

%X          不带正负号的十六进制值,使用AF表示1015

%%         字面意义的%

根据POSIX标准:浮点格式%e%E%f%g%G是“不需要被支持”。

这是因为awk支持浮点预算,且有它自己的printf语句。这样Shell程序中

需要将浮点数值进行格式化的打印时,可使用小型的awk程序实现。然而,内建

bashksh93zsh中的printf命令都支持浮点格式。


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值:

阅读(6197) | 评论(2) | 转发(1) |
给主人留下些什么吧!~~

chenliangmoran2011-08-03 11:52:22

Fatihyang: 不得不说 你写的可以 但是花这些时间写博客 还不如 用来继续学习 笔记写在记事本就好.....
关于写博客和写笔记的讨论很多,我个人比较赞同用写博客的方式来巩固学习内容,还有一个原因是受环境的限制--写到博客里用的时候方便查找。

Fatihyang2011-08-02 21:21:23

不得不说 你写的可以 但是花这些时间写博客 还不如 用来继续学习 笔记写在记事本就好