Go to main content

手册页部分 1:用户命令

退出打印视图

更新时间: 2018年8月8日 星期三
 
 

printf(1)

名称

printf - 写入格式化输出

用法概要

/usr/bin/printf

printf format [argument]...

ksh

printf format [string...]

描述

/usr/bin/printf

printf 实用程序使用 format 将每个字符串操作数写入标准输出以控制输出格式。

操作数

/usr/bin/printf

/usr/bin/printf 支持以下操作数:

format

描述用于写入剩余操作数的格式的字符串。format 操作数用作 format 字符串(如 formats(7) 手册页所述),但下述情况例外:

  • 在任何非转换规范标志的上下文中,格式字符串中的空格字符都被视为复制到输出的普通字符。

  • 格式字符串中的字符将被视为字符,而不会视为空格字符。

  • formats(7) 手册页 (\\, \a, \b , \f, \n, \r, \t, \v) 上所述的转义序列外,还有 \ddd,其中 ddd 是一位、两位或三位八进制数字,并写为以八进制数字指定的数值的一个字节。

  • 该程序之前或之后没有来自 du 转换规范的输出(包含 format 操作数未指定的空白字符)。

  • 该程序之前或之后没有来自 o 转换规范的输出(包含 format 操作数未指定的前导零)。

  • 还支持另一个转换字符 b,如下所示。参数被视为可包含反斜杠转义序列的字符串。支持以下反斜杠转义序列:

    • formats(7) 手册页 (\\, \a, \b, \f, \n, \r, \t, \v) 上列出的转义序列,将转换为其表示的字符

    • \0ddd,其中 ddd 是一位、两位或三位八进制数字,将转换为包含由八进制数字指定的数值的字节

    • \c,将写入并会导致 printf 忽略包含该转义序列的字符串操作数中的任何剩余字符、任何剩余字符串操作数及 format 操作数中的任何其他字符。

反斜杠(后跟任何其他字符序列)解释不确定。

写入转换字符串中的字节(直至字符串末尾,或者达到由精度规范指示的字节数)。如果省略精度,则会无限写入,即写入所有字节(直至转换字符串末尾)。对于使用参数的每个规范,将计算下一个参数操作数并将其转换为相应的转换类型,如下文指定。根据需要尽量多次重用 format 操作数以满足参数操作数要求。在计算任何额外 cs 转换规范时会假定提供了空字符串参数;计算其他额外转换规范时则假定提供了零参数。如果 format 操作数不包含转换规范但包含 argument 操作数,则结果不确定。如果 format 字符串中的某个字符序列以 % 字符开头,但未形成有效的转换规范,则行为不确定。

argument

字符串将写入标准输出,并会受到 format 的控制。如果对应的转换字符是 bcs,则 argument 操作数将被视为字符串。否则,将作为 C 常量计算(如 ISO C 标准所述),并具有以下扩展:

  • 允许前导加号或减号。

  • 如果前导字符为单引号或双引号,值为单引号或双引号后的字符底层代码集中的数值。

如果不能将参数操作数完全转换为对应于相应转换规范的内部值,诊断消息将被写入标准错误,实用程序退出时不会返回零退出状态,但会继续处理所有剩余操作数,并将检测到错误时累积的值写入到标准输出。

ksh

format 操作数支持全范围 ANSI C/C99/XPG6 格式设置说明符及其他说明符:

%b

特别处理字符串操作数中的每个字符,如下所示:

\a

警报字符。

\b

退格符。

\c

终止输出并且不附加换行。忽略其余字符串操作数。

\E

转义字符(ASCII 八进制值 033)。

\f

换页符。

\n

换行符。

\t

制表符。

\v

垂直制表符。

\\

反斜杠字符。

\0x

8 位字符,其 ASCII 代码为 123 位数八进制数字 x

%B

将参数视为变量名称并输出值(无需将其转换为字符串)。这对于 –b 类型的变量非常有用。

%H

带有 <&>" 字符和不可输出字符的输出字符串(正确转义以便在 HTML 和 XML 文档中使用)。

%P

string 视为扩展正则表达式并将其转换为 shell 模式。

%q

输出 string 以特定的方式用引号引起,以便 shell 读取并返回相同的字符串。但是,因缺少字符串操作数导致的空字符串则不会用引号引起。

%R

string 视为 shell 模式表达式并将其转换为扩展正则表达式。

%T

string 视为日期/时间字符串并为其设置格式。T 前面可带有 (dformat),其中 dformat 是日期格式(如 date(1) 命令所定义)。

%Z

输出值为 0 的字节。

执行 string 转换以满足数字格式说明符的要求时,如果 string 的第一个字符为 "or',则该值是 "or' 后的字符的底层代码集中的数值。否则,将 string 与 shell 算术表达式一样对待并进行计算。

如果无法将 string 操作数完全转换为适用于该格式说明符的值,将发生错误,但仍将继续处理剩余的 string 操作数。

除格式说明符扩展外,格式说明符中允许以下 ANSI C/C99/XPG6 扩展:

  • 转义序列 \E\e 扩展为转移字符(在 ASCII 中为八进制 033)。

  • 转义序列 \cx 扩展为 CTRL-x。

  • 转义序列 \C[.name.] 扩展为整理元素 name

  • 转义序列 \x{hex} 扩展为十六进制值 hex 对应的字符。

  • 格式修饰符标志 = 可用于将字段居中为指定的宽度。输出为终端时,使用该字符宽度而非字节数。

  • 每个整数格式说明符还可包含第三个修饰符(在宽度和精度之后),用于将转换基数指定为 2 到 64 之间。在这种情况下,可通过 # 修饰符将 base# 附加到值的前面。

  • # 修饰符可在未指定基数的情况下与 d 说明符一起使用,从而以 1000 为单位(带有其中一个 k M G T P E 的后缀)写入输出。

  • # 修饰符可与 i 说明符一起使用,从而以 1024 为单位(带有其中一个 Ki Mi Gi Ti Pi Ei 的后缀)写入输出。

如果 string 操作数超过格式说明符,则将从头开始重新处理格式字符串。如果 string 操作数少于格式说明符,则按照提供空字符串的方式处理 string 说明符、按照提供 0 的方式处理数字转换,并按照提供 now 的方式处理时间转换。

/usr/bin/printf 等效于 kshprintf 内置和 print -f,允许指定其他选项。

用法

/usr/bin/printf

printf 实用程序(如其所基于的 printf(3C) 函数)未针对使用 %c 转换规范时处理多字节字符设置任何特殊规定。字符集中包含多字节字符时,应用程序在使用上述任一功能时应极端谨慎。

不能将字段宽度和精度指定为 *

%b 转换规范不是 ISO C 标准的一部分;此处已将其添加为可移植方式用来处理 echo 实用程序所提供的字符串操作数中扩展的反斜杠转义。另请参见 echo(1) 手册页的“用法”部分,了解使用 printf 替换所有传统版本的 echo 实用程序的方式。

如果不能正确解析对应转换规范的参数,printf 实用程序会报告错误。因此,用于执行数字转换的参数末尾的溢出和多余字符将报告为错误。

如果未完全使用参数操作数执行 cs 转换,或使用字符串操作数的第一个或第二个字符获取字符数值,则不会视为错误。

示例

/usr/bin/printf 示例

示例 1 列显一系列提示

以下示例向用户发出警报,然后输出并读取一系列提示:

example% printf "\aPlease fill in the following: \nName: "
read name
printf "Phone number: "
read phone
示例 2 列显计算表

以下示例输出计算表。从文件中读出正确和错误答复列表,正确计算百分比并将其输出。向右调整数字并以单个制表符分隔数字。百分比将写入某个精度小数位:

example% while read right wrong ; do
   percent=$(echo "scale=1;($right*100)/($right+$wrong)" | bc)
   printf "%2d right\t%2d wrong\t(%s%%)\n" \
	   $right $wrong $percent
done < database_file
示例 3 列显数字字符串

此命令:

example% printf "%5d%4d\n" 1 21 321 4321 54321

生成:

    1  21
  3214321
54321   0

使用三次 format 操作数以输出所有给定字符串,printf 还提供了 0 以满足最后一个 %4d 转换规范的要求。

示例 4 将转换错误制成表格

以下示例将转换错误制成表格。

printf 实用程序会在生成数字输出过程中检测到转换错误时通知用户。指定 %d 作为 format 操作数时,通过 32 位二进制补码整数实现时将提供以下结果:

参数
标准
诊断
5a
5
printf:5a 未完全转换
9999999999
2147483647
printf:9999999999:结果过大
-9999999999
-2147483648
printf:-9999999999:结果过大
ABC
0
printf:ABC 应当采用数值

标准输出显示的值将作为函数 strtol(3C) 的返回值提供。%ustrtoul(3C) 以及 %e%f%gstrtod(3C) 之间存在类似的对应关系。

示例 5 列显特定语言环境的输出

以下示例输出特定语言环境的输出。在语言环境中,使用 ISO/IEC 646:1991 标准作为底层代码集,命令:

example% printf "%d\n" 3 +3 -3 \'3 \"+3 "'-3"

生成:

3
常量 3 的数值
3
常量 3 的数值
-3
常量 -3 的数值
51
ISO/IEC 646:1991 标准代码集中的字符 '3' 的数值
43
ISO/IEC 646:1991 标准代码集中的字符 '+' 的数值
45
SO/IEC 646:1991 标准代码集中的字符 '-' 的数值

在带有多字节字符的语言环境中,字符的值将作为与该字符的 wchar_t 表示形式等效的值。

如果不能将参数操作数完全转换为对应于相应转换规范的内部值,诊断消息将被写入标准错误,实用程序退出时会返回零退出状态,但会继续处理所有剩余操作数,并将检测到错误时累积的值写入到标准输出。

ksh 示例

以下示例说明如何使用 ksh93 版本的 printf

示例 6 备用浮点表示法 1

printf 实用程序支持备用浮点表示法(有关 "%a"/"%A",请参见 printf(3C) 条目),从而以特定的格式输出浮点值,避免由常规 base16 到 base10 的舍入误差。

example% printf "%a\n" 2 3.1 NaN

生成:

0x1.0000000000000000000000000000p+01
0x1.8ccccccccccccccccccccccccccdp+01
nan
示例 7 备用浮点表示法 2

以下示例显示相同浮点值的两种不同表示法。

example% x=2 ; printf "%f == %a\n" x x

生成:

2.000000 == 0x1.0000000000000000000000000000p+01
示例 8 Unicode 值的输出

以下命令将输出 EURO Unicode 符号(代码点 0x20ac)。

example% LC_ALL=en_US.UTF-8 printf "\u[20ac]\n"

生成:

<euro>

其中 <euro> 表示 EURO 货币符号字符。

示例 9 将 Unicode 字符转换为 Unicode 代码点值

以下命令将输出给定字符的十六进制值。

example% export LC_ALL=en_US.UTF-8
example% printf "%x\n" "'<euro>"

其中 <euro> 表示 EURO 货币符号字符(代码点 0x20ac)。

生成:

20ac
示例 10 列显 ASCII 字符的数值
example% printf "%d\n" "'A"

生成:

65
示例 11 列显独立于语言的日期和时间格式

要输出独立于语言的日期和时间格式,可以使用以下语句:

example% printf "format" weekday month day hour min

例如,

$ printf format "Sunday" "July" 3 10 2

对于美国使用,格式可为以下字符串:

"%s, %s %d, %d:%.2d\n"

生成消息:

Sunday, July 3, 10:02

而对于欧盟使用,格式可为以下字符串:

"%1$s, %3$d. %2$s, %4$d:%5$.2d\n"

请注意,必须正确转义 '$' 字符,如

"%1\$s, %3\$d. %2\$s, %4\$d:%5\$.2d\n" in this case

生成消息:

Sunday, 3. July, 10:02

环境变量

有关影响 printf 执行的以下环境变量的说明,请参见 environ(7):LANG、LC_ALL、LC_CTYPE、LC_MESSAGES、LC_NUMERIC 和 NLSPATH。

退出状态

将返回以下退出值:

0

成功完成。

>0

出现错误。

属性

有关下列属性的说明,请参见 attributes(7)

/usr/bin/printf

属性类型
属性值
可用性
text/locale
CSI
Enabled(已启用)
接口稳定性
Committed(已确定)
标准
请参见 standards(7)

ksh

属性类型
属性值
可用性
system/core-os
接口稳定性
Uncommitted(未确定)

另请参见

awk(1)bc(1)date(1)echo(1)ksh(1)printf(3C)strtod(3C)strtol(3C)strtoul(3C)attributes(7)environ(7)formats(7)、standards(7)

附注

使用未在 printf(3C) 或此手册页中列出的格式说明符('%' 后的字符),将会导致行为不确定。

使用未在 printf(3C) 或此手册页中列出的转义序列(反斜杠 ('\') 后的字符),将会导致行为不确定。

浮点值遵循 C99、XPG6 和 IEEE 754 标准行为,并可采用与平台的 |long double| 数据类型相同的方式处理值。

浮点值单独处理符号,从而允许对值使用符号,如 NaN(例如 -nan)、Infinite(例如 -inf)和零(例如 -0.0)。