目录
内容来源:
GUN : Coreutils - GNU core utilities
busybox v1.36.1 : 【busybox记录】【shell指令】基于的Busybox的版本和下载方式-CSDN博客
【GUN】【printf】指令介绍
printf:格式化和打印数据
Printf对文本进行格式化打印。
简介:
printf format [argument]...
printf打印格式字符串,解释' % '指令和' \ '转义,以一种与C ' printf '函数非常相似的方式格式化数字和字符串参数。详细信息请参见GNU C库参考手册中的“printf格式指令”一节。区别如下所示。
由于shell别名和内置的printf函数,交互式地或在脚本中使用未经修饰的printf可能会获得与此处描述的功能不同的功能。通过env(即env printf…)调用它,以避免来自shell的干扰。
•如果需要,可以重用format参数来转换所有给定的参数。例如,命令' printf %s ab '输出' ab '。
•缺少的参数将被视为空字符串或零,这取决于上下文需要的是字符串还是数字。例如,命令' printf %sx%d '打印' x0 '。
•额外的转义' \c '将导致printf不再产生进一步的输出。例如,命令 ‘printf 'A%sC\cD%sF' B E’ 打印' ABC '。
•十六进制转义序列' \xhh '最多有两个数字,而不是C,它可以有无限数量的数字。例如,命令 ‘printf '\x07e'’ 打印两个字节,而C语句 ‘printf ("\x07e")’只打印一个字节。
•一个额外的指令' %b ',以与格式字符串相同的方式输出带有' \ '转义的参数字符串,除了八进制转义是 ‘\0ooo’ 的形式,其中‘ ooo ’是0到3个八进制数字。如果' \ooo '是9位值,则忽略第9位。
如果还给出了精度,则会限制从转换后的字符串打印的字节数。
•一个额外的指令' %q ',以一种可以被大多数shell重用的格式打印它的参数字符串。不可打印的字符使用POSIX建议的 ‘$''’ 语法进行转义,shell元字符被适当地引用。这是与 ls --quoting=shell-escape 输出相同的格式。
•数字参数必须是单个C常量,可能以' + '或' - '开头。例如, ‘printf %.4d -3’输出' -0003 '。
•如果数字参数的前导字符是 ‘"’ 或者 ‘'’,则其值是紧跟其后的字符的数字值。如果设置了POSIXLY_CORRECT环境变量,则将静默忽略任何剩余字符;否则,打印警告。
例如, ‘printf "%d" "'a"’ 在使用ASCII字符集的主机上输出' 97 ',因为'a '在ASCII中具有数字值97。
浮点参数根据当前语言环境或C语言环境的LC_NUMERIC类别进行解释,并根据当前语言环境打印。例如,在小数点字符为逗号的区域设置中,命令 ‘printf '%g %g' 2,5 2.5’ 输出 ' 2,5,2,5 '。参见第10页第2.12节[浮点数]。
Printf将格式中的' \ooo '解释为八进制数(如果ooo是1到3个八进制数字),指定要打印一个字节,并将' \xhh '解释为十六进制数(如果hh是1到2个十六进制数字),指定要打印一个字符。
但是,当' \ooo '指定的数字大于255时,printf会忽略第9位。例如,' printf '\400 "相当于' printf '\0 "。
printf解释用于指定Unicode (ISO/IEC 10646)字符的两种语法形式。' \u '表示16位Unicode字符,指定为4个十六进制数字hhhh, ' \u '表示32位Unicode字符,指定为8个十六进制数字hhhhhh。
printf根据LC_CTYPE区域设置输出Unicode字符。此语法不能指定U+D800. .U+DFFF范围内的Unicode字符。这种语法完全支持ISO c99中引入的通用字符子集。
处理' \u '和' \u '需要一个功能齐全的图标工具。它在使用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等)中正确输出。
在这些示例中,printf命令是通过env调用的,以确保我们运行的是通过shell的搜索路径找到的程序,而不是shell别名或内置函数。
对于较大的字符串,您不需要逐个查找每个字符的十六进制代码值。ASCII字符混合\u转义序列也称为JAVA源文件编码。
您可以使用GNU recode 3.5c(或更新版本)将字符串转换为这种编码。下面是如何将一段文本转换为shell脚本,该脚本将以独立于语言环境的方式输出该文本:
$ LC_CTYPE=zh_TW.big5 env printf \
'\u4e2d\u6587\n' > sample.txt
$ recode BIG5..JAVA < sample.txt \
| sed -e "s|^|env printf '|" -e "s|%|%%|g" -e "s|$|\\\\n'|" \
> sample.sh
唯一的选择是单独-帮助或-版本。参见第2章[常用选项],第2页。选项必须在操作数之前。
退出状态为0表示成功,非0表示失败。
【busybox】【printf】指令介绍
NA
【linux】【printf】指令介绍
[root@localhost bin]# printf --help
printf: printf [-v var] 格式 [参数]
在 FORMAT 的控制下格式化并打印 ARGUMENTS 参数。
选项:
-v var 将输出赋值给 shell 变量 VAR 而不显示在标准输出上
FORMAT 是包含三种对象的字符串:简单地被拷贝到标准输出的普通字符;
被变换之后拷贝到标准输入的转义字符;以及每个都会影响到下个参数的打印的格式化声明。
在 printf(1) 中描述的标准控制声明之外,printf 解析:
%b 扩展对应参数中的反斜杠转义序列
%q 以可作为 shell 输入的格式引用参数
%(fmt)T 以 FMT 为供给 strftime(3) 的格式输出日期时间字符串
退出状态:
返回成功,除非使用了无效的选项或者写或赋值错误发生。
使用示例:
输出指定格式 - 10进制转16进制输出
指令:printf "0x%02x\n" 125