「printf(1)」-

  LINUX MANUAL PAGES

格式化数据并打印

命令语法格式

printf FORMAT [ARGUMENT]…

printf OPTION

命令描述

命令printf打印以参数FORMAT指定的格式打印ARGUMENT,解析参数FORMAT中的’%’指令和’\’转义来格式化数字和字符串参数,其方式与C语言中’printf’函数大致相似。

有关详细信息,请参阅“GNU C库参考手册”中的「printf格式化指令」,关于二者之间的差异参考下面的「与printf(3)函数之间的差异」部分。

命令支持的选项及含义

–help
显示帮助信息。

–version
显示版本信息并退出。

转义序列

请参阅“GNU C库参考手册”中的printf格式化指令

与printf(3)函数之间的差异

必要时,命令printf会重用FORMAT参数来转换所有给定的参数ARGUMENT。例如,命令printf '%s#' a b输出’a#b#’这与printf '%s#%s#' a b的输出相同。

缺少的参数ARGMENT被视为空字符串()或零(0),这取决于上下文是字符串还是数字。例如,命令printf %sx%d”打印的结果为’x0’。

无意义的转义符,比如’\c’,会导致命令printf终止解析,不再产生输出。例如,命令printf 'A%sC\cD%sF' B E输出’ABC’。

十六进制转义序列’\xhh’最多可以有两位,而不同于C语言中可以有无限数量的数字。例如,命令printf '\x07e‘打印两个字节,而C语言中printf ("\x07e")打印只有一个字节。

指令“%b”会将参数ARGUMENT中的转义序列进行特殊处理,对比命令printf '%s' "\n1"与命令printf '%s' "\n1"的输出。所不同的是八进制转义的形式为“\0ooo”其中ooo是0至3个八进制数字。如果’\ooo’是9位值(超过255),则忽略第9位。如果还给出了精度,则它限制从转换后的字符串打印的字节数。

指令’%q’会以”Shell可重用”的格式打印其参数字符串,”Shell可重用”指的是可以被大多数Shell重用作输入。使用POSIX建议的$语法转义不可打印的字符,并适当引用Shell元字符。这是类似于ls –quoting=shell-escape”的输出。

数字类型的参数必须是简单的C常量,可能带有前导’+’或’-‘。例如,printf %.4d -3输出’-0003’。

如果一个数字类型的参数的前导字符是引号(单引号或双引号),然后输出为紧随引号字符的值。如果设置了POSIXLY_CORRECT环境变量,任何剩余的字符被自动忽略;否则,打印警告。例如,printf "%d" "'a"在使用ASCII字符集的主机上输出’97’,因为’a’在ASCII中的数值97。

注意事项

由于Shell别名和内置的printf指令,在脚本中直接调用的printf命令并不是本文所描述的。通过env(1),即env printf,调用它以避免Shell的干扰。或者可以使用绝对路径进行调用。

对于浮点类型的参数,小数位之前必须使用句号(.),但是会根据当前语言环境的LC_NUMERIC类别来确定打印结果中小数位前的字符。例如,在基数字符为逗号(,)的语言环境中,命令printf %g 3.14输出’3,14’,而命令printf %g 3,14是错误。请参阅浮点类型

命令printf将格式FORMAT中的’\ooo’解释为八进制数(如果ooo是1到3个八进制数),它指定要打印的字节。将’\xhh’作为十六进制数(如果hh是1到2个十六进制数字),它指定一个字符打印。但请注意,当’\ooo’指定的值大于对应的十进制数字255时,命令printf会忽略第9位。例如,命令printf '\400‘相当于printf \0

命令printf支持解释ISO C 99中引入的两种字符语法:’\u’表示16位Unicode(ISO/IEC 10646)字符,指定为4位十六进制数字(hhhh);而`\U`表示32位Unicode字符,指定为8个十六进制数字(hhhhhhhh)。printf根据LC_CTYPE语言环境输出Unicode字符。

除了U+0024($),U+0040(@),U+0060(`)之外,此语法不能用于指定U+0000...U+009F以及U+D800...U+DFFF范围内的Unicode字符。

注意,处理’\u’和’\U’需要功能齐全的iconv工具,它在具有glibc 2.2(或更新版本)的系统上,或者在此软件包之前先安装libiconv时才可用。否则’\u’和’\U’将按原样打印。

使用示例

Unicode字符语法对于以区域设置无关的方式编写字符串非常有用。例如,包含欧元货币符号的字符串:

# env printf ‘\u20AC 14.95’

将在支持欧元符号(ISO-8859-15,UTF-8和其他)的所有语言环境中正确输出。同样,一个中文字符串:

# env printf ‘\u4e2d\u6587’

将在所有中文语言环境中正确输出(GB2312,BIG5,UTF-8等)。

请注意,在这些示例中,已经通过env调用了printf命令,以确保我们运行通过Shell的搜索路径PATH找到的printf程序,而不是shell别名或内置函数。

对于较大的字符串,你不需要逐个查找每个字符的十六进制代码值。与\u转义序列混合的ASCII字符也称为JAVA源文件编码。你可以使用GNU recode 3.5c(或更新版本)将字符串转换为此编码。以下是如何将一段文本转换为Shell脚本,该脚本将以与语言环境无关的方式输出此文本:

# env LC_CTYPE=zh_CN.big5 printf ‘\u4e2d\u6587\n’ > sample.txt


# recode BIG5..JAVA < sample.txt | sed -e “s|^|env printf ‘|” -e “s|$|\\\\n’|” > sample.sh

如上示例,无论语言环境如何都可以正常输出中文。

相关手册

printf(3)

查看在线手册:http://www.gnu.org/software/coreutils/printf

查看info手册:info ‘(coreutils) printf invocation’

参考文献

  • man 1 printf, version GNU coreutils 8.28

待办事项

# TODO 参考printf(3)手册完善手册

更新日志

  • 07/04/2018 创建文章