man printf.1
在底部有一个注释:“ ...您的外壳可能具有自己的版本printf
...”。这个问题被标记为bash
,但是,如果有可能,我尝试编写可移植到任何shell的脚本。 dash
通常是便携的好最低底线-这样的答案在这里工作的bash
,dash
,和zsh
。如果脚本可以在这3个脚本中工作,那么它很可能可以移植到几乎任何地方。
[1]中的最新实现不会printf
在给定带有ANSI转义字符的格式说明符的情况下对输出进行着色-但是,将格式说明符与八进制(等效于ASCII )结合起来就可以完成工作。请评论任何异常值,但是AFAIK,所有shell均已实现dash
%s
\e
%b
\033
ESC
printf
了使用ASCII八进制子集的最低要求。
对于“在printf中使用颜色”问题的标题,设置格式的最可移植的方法是将%b
格式说明符printf
(如@Vlad的较早答案中所述)与八进制转义相结合\033
。
Portable-color.sh
P="\033["
BLUE=34
printf "-> This is %s %-6s %s text \n" $P"1;"$BLUE"m" "blue" $P"0m"
printf "-> This is %b %-6s %b text \n" $P"1;"$BLUE"m" "blue" $P"0m"
输出:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
...第二行中的“蓝色”是蓝色。
在%-6s
从OP格式说明是在开合控制字符序列之间的格式串的中间。
[1]参考:man dash
“ Builtins”部分::“ printf” ::“ Format”