在 printf 中使用颜色
当这样写时,它以蓝色输出文本:
printf "\e[1;34mThis is a blue text.\e[0m"
但我想在 printf 中定义格式:
printf '%-6s' "This is text"
现在我尝试了几种如何添加颜色的选项,但没有成功:
printf '%-6s' "\e[1;34mThis is text\e[0m"
我什至尝试将属性代码添加到格式但没有成功。 这不起作用,我在任何地方都找不到将颜色添加到 printf 的示例,它已定义了与我的情况相同的格式。
When written like this, it outputs text in blue:
printf "\e[1;34mThis is a blue text.\e[0m"
But I want to have format defined in printf:
printf '%-6s' "This is text"
Now I have tried several options how to add color, with no success:
printf '%-6s' "\e[1;34mThis is text\e[0m"
I even tried to add attribute code to format with no success.
This does not work and I can't find anywhere an example, where colors are added to printf, which has defined format as in my case.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
我可以建议使用以下替代方案,而不是使用陈旧的终端代码。它不仅提供了更具可读性的代码,而且还允许您将颜色信息与格式说明符分开,就像您最初的意图一样。
请参阅我的答案此处了解其他颜色
Rather than using archaic terminal codes, may I suggest the following alternative. Not only does it provide more readable code, but it also allows you to keep the color information separate from the format specifiers just as you originally intended.
See my answer HERE for additional colors
你将这些部分混合在一起,而不是干净地分开它们。
基本上,将固定的内容放在格式中,将可变的内容放在参数中。
You're mixing the parts together instead of separating them cleanly.
Basically, put the fixed stuff in the format and the variable stuff in the parameters.
这对我有用:
来自
printf(1)
:This works for me:
From
printf(1)
:这是一个在终端上获得不同颜色的小程序。
This is a small program to get different color on terminal.
这是一个使用 bash 脚本打印彩色文本的小函数。您可以添加任意数量的样式,甚至打印选项卡和换行符:
This is a little function that prints colored text using bash scripting. You may add as many styles as you want, and even print tabs and new lines:
我使用这个 C 代码来打印彩色 shell 输出。该代码基于 this邮政。
I use this c code for printing coloured shell output. The code is based on this post.
man printf.1
在底部有一条注释:“...您的 shell 可能有自己的printf
版本...”。这个问题被标记为 bash,但如果可能的话,我尝试编写可移植到任何 shell 的脚本。dash
通常是可移植性的一个很好的最低基线 - 所以这里的答案适用于bash
、dash
和 & 。zsh
。如果一个脚本可以在这 3 种环境中运行,那么它很可能可以移植到任何地方。dash
[1] 中printf
的最新实现不会对给定%s
格式说明符的输出进行着色ANSI 转义字符\e
-- 但是, 格式说明符%b
与八进制\033
组合(等效转换为 ASCIIESC
)即可完成工作。请评论任何异常值,但据我所知,所有 shell 都实现了printf
来至少使用 ASCII 八进制子集。对于问题“在 printf 中使用颜色”的标题,设置格式的最可移植方法是将
%b
格式说明符与printf
(如之前 @Vlad 的答案中所引用),带有八进制转义\033
。portable-color.sh
输出:
...第二行中的“blue”是蓝色。
OP 中的
%-6s
格式说明符位于格式字符串开头 & 之间的中间。结束控制字符序列。<子>
[1] 参考:
man dash
“Builtins”部分: : "printf" :: "格式"man printf.1
has a note at the bottom: "...your shell may have its own version ofprintf
...". This question is tagged forbash
, but if at all possible, I try to write scripts portable to any shell.dash
is usually a good minimum baseline for portability - so the answer here works inbash
,dash
, &zsh
. If a script works in those 3, it's most likely portable to just about anywhere.The latest implementation of
printf
indash
[1] doesn't colorize output given a%s
format specifier with an ANSI escape character\e
-- but, a format specifier%b
combined with octal\033
(equivalent to an ASCIIESC
) will get the job done. Please comment for any outliers, but AFAIK, all shells have implementedprintf
to use the ASCII octal subset at a bare minimum.To the title of the question "Using colors with printf", the most portable way to set formatting is to combine the
%b
format specifier forprintf
(as referenced in an earlier answer from @Vlad) with an octal escape\033
.portable-color.sh
Outputs:
...and 'blue' is blue in the second line.
The
%-6s
format specifier from the OP is in the middle of the format string between the opening & closing control character sequences.[1] Ref:
man dash
Section "Builtins" :: "printf" :: "Format"这声明了你所有的颜色。如果颜色可能不可用,您可能需要一种后备方法。您可以这样写:
或者,如果您想在多行中撰写消息,只需省略 '\n'
This declares all your colors. If the colors might not be available, you might want a way to fallback. You could write:
Or if you want to compose a message over multiple lines, just leave out the '\n'