printf - 写入格式化输出
printf format [argument]...
printf format [string...]
printf 实用程序使用 format 将每个字符串操作数写入标准输出以控制输出格式。
/usr/bin/printf 支持以下操作数:
描述用于写入剩余操作数的格式的字符串。format 操作数用作 format 字符串(如 formats(7) 手册页所述),但下述情况例外:
在任何非转换规范标志的上下文中,格式字符串中的空格字符都被视为复制到输出的普通字符。
格式字符串中的字符将被视为字符,而不会视为空格字符。
除 formats(7) 手册页 (\\, \a, \b , \f, \n, \r, \t, \v) 上所述的转义序列外,还有 \ddd,其中 ddd 是一位、两位或三位八进制数字,并写为以八进制数字指定的数值的一个字节。
该程序之前或之后没有来自 d 或 u 转换规范的输出(包含 format 操作数未指定的空白字符)。
该程序之前或之后没有来自 o 转换规范的输出(包含 format 操作数未指定的前导零)。
还支持另一个转换字符 b,如下所示。参数被视为可包含反斜杠转义序列的字符串。支持以下反斜杠转义序列:
formats(7) 手册页 (\\, \a, \b, \f, \n, \r, \t, \v) 上列出的转义序列,将转换为其表示的字符
\0ddd,其中 ddd 是一位、两位或三位八进制数字,将转换为包含由八进制数字指定的数值的字节
\c,将写入并会导致 printf 忽略包含该转义序列的字符串操作数中的任何剩余字符、任何剩余字符串操作数及 format 操作数中的任何其他字符。
反斜杠(后跟任何其他字符序列)解释不确定。
写入转换字符串中的字节(直至字符串末尾,或者达到由精度规范指示的字节数)。如果省略精度,则会无限写入,即写入所有字节(直至转换字符串末尾)。对于使用参数的每个规范,将计算下一个参数操作数并将其转换为相应的转换类型,如下文指定。根据需要尽量多次重用 format 操作数以满足参数操作数要求。在计算任何额外 c 或 s 转换规范时会假定提供了空字符串参数;计算其他额外转换规范时则假定提供了零参数。如果 format 操作数不包含转换规范但包含 argument 操作数,则结果不确定。如果 format 字符串中的某个字符序列以 % 字符开头,但未形成有效的转换规范,则行为不确定。
字符串将写入标准输出,并会受到 format 的控制。如果对应的转换字符是 b、c 或 s,则 argument 操作数将被视为字符串。否则,将作为 C 常量计算(如 ISO C 标准所述),并具有以下扩展:
允许前导加号或减号。
如果前导字符为单引号或双引号,值为单引号或双引号后的字符底层代码集中的数值。
如果不能将参数操作数完全转换为对应于相应转换规范的内部值,诊断消息将被写入标准错误,实用程序退出时不会返回零退出状态,但会继续处理所有剩余操作数,并将检测到错误时累积的值写入到标准输出。
format 操作数支持全范围 ANSI C/C99/XPG6 格式设置说明符及其他说明符:
特别处理字符串操作数中的每个字符,如下所示:
警报字符。
退格符。
终止输出并且不附加换行。忽略其余字符串操作数。
转义字符(ASCII 八进制值 033)。
换页符。
换行符。
制表符。
垂直制表符。
反斜杠字符。
8 位字符,其 ASCII 代码为 1、2 或3 位数八进制数字 x。
将参数视为变量名称并输出值(无需将其转换为字符串)。这对于 –b 类型的变量非常有用。
带有 <、&、>、" 字符和不可输出字符的输出字符串(正确转义以便在 HTML 和 XML 文档中使用)。
将 string 视为扩展正则表达式并将其转换为 shell 模式。
输出 string 以特定的方式用引号引起,以便 shell 读取并返回相同的字符串。但是,因缺少字符串操作数导致的空字符串则不会用引号引起。
将 string 视为 shell 模式表达式并将其转换为扩展正则表达式。
将 string 视为日期/时间字符串并为其设置格式。T 前面可带有 (dformat),其中 dformat 是日期格式(如 date(1) 命令所定义)。
输出值为 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 等效于 ksh 的 printf 内置和 print -f,允许指定其他选项。
printf 实用程序(如其所基于的 printf(3C) 函数)未针对使用 %c 转换规范时处理多字节字符设置任何特殊规定。字符集中包含多字节字符时,应用程序在使用上述任一功能时应极端谨慎。
不能将字段宽度和精度指定为 *。
%b 转换规范不是 ISO C 标准的一部分;此处已将其添加为可移植方式用来处理 echo 实用程序所提供的字符串操作数中扩展的反斜杠转义。另请参见 echo(1) 手册页的“用法”部分,了解使用 printf 替换所有传统版本的 echo 实用程序的方式。
如果不能正确解析对应转换规范的参数,printf 实用程序会报告错误。因此,用于执行数字转换的参数末尾的溢出和多余字符将报告为错误。
如果未完全使用参数操作数执行 c 或 s 转换,或使用字符串操作数的第一个或第二个字符获取字符数值,则不会视为错误。
以下示例向用户发出警报,然后输出并读取一系列提示:
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 位二进制补码整数实现时将提供以下结果:
|
标准输出显示的值将作为函数 strtol(3C) 的返回值提供。%u 与 strtoul(3C) 以及 %e、%f 和 %g 与 strtod(3C) 之间存在类似的对应关系。
示例 5 列显特定语言环境的输出以下示例输出特定语言环境的输出。在语言环境中,使用 ISO/IEC 646:1991 标准作为底层代码集,命令:
example% printf "%d\n" 3 +3 -3 \'3 \"+3 "'-3"
生成:
|
在带有多字节字符的语言环境中,字符的值将作为与该字符的 wchar_t 表示形式等效的值。
如果不能将参数操作数完全转换为对应于相应转换规范的内部值,诊断消息将被写入标准错误,实用程序退出时会返回零退出状态,但会继续处理所有剩余操作数,并将检测到错误时累积的值写入到标准输出。
以下示例说明如何使用 ksh93 版本的 printf。
示例 6 备用浮点表示法 1printf 实用程序支持备用浮点表示法(有关 "%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。
将返回以下退出值:
成功完成。
出现错误。
有关下列属性的说明,请参见 attributes(7):
|
|
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)。