问题:Linux下,如何让命令行输出带颜色的字符串?
我们知道,在Windows中,conio.h
中有许多操作控制台颜色、格式的函数。但是再 Linux 平台下却没有类似的函数。那Linux下如何实现这一虽不实用但可以炫酷的效果呢?
经过在网上的一番搜索,找到了解决此问题的方法——转义字符\e
。
注意,\e
这种写法可能并不被你的编译器所支持(Linux下的GNU和Bash支持,亲测无误),因为他并不是ANSI C的。可以用\033
代替。
此种方式在 Windows 下无效。
注意:格式更改之后,即使更改他的程序退出,格式也会保留,除非使用代码0
清除或退出这个终端。
\e
的大致使用方式为\e<控制串><带修饰的字符串>
。用来控制字符串在控制台的输出效果(包括加粗、倾斜、颜色等)。注意,<控制传>
只是表示这地方是个控制串,包裹它用的<>
并不是我们要输入的内容,后面均用这种形式表示。
控制串的基本形式:[<数字><字母>
,注意开头处有个左方括弧[
。
下面我们将对各种控制串的参数做详细的说明。
1. 基本格式控制
使用以下代码更改输出格式:
\e[<格式代码>m
下面是各种格式控制的代码:
代码十进制 | 作用 |
---|---|
0 | 清除所有格式(常用在格式控制末尾,以免对后序字符串造成影响) |
1 | 加粗,与格式2 冲突 |
2 | 字体变暗,与格式1 冲突 |
3 | 斜体 |
4 | 下划线 |
5 | 呼吸闪烁(但有的机器上没效果)) |
6 | 同上 |
7 | 反显(背景色当前景色,前景色当背景色) |
8 | 隐形(字符仍然存在,可以选中,只是看不到) |
9 | 删除线 |
举例
#include<stdio.h>
int main()
{
int i;
printf("输出格式设置:0-9\n");
for(i=0;i<=9;++i){
printf("%d: \e[%dmHello,World!\e[0m\n",i,i);
}
return 0;
}
下面看在不同环境下的演示效果:
【虚拟机中的Ubuntu】
【FinalShell连接的CentOS】
不支持5、6呼吸闪烁,可以看到诸多8、9效果也不支持。
【PowerShell连接的CentOS】
2. 颜色控制
控制串基本格式:
\e[<颜色代码>m
注意<颜色代码>后面同样跟的是字母m
。
下面是各种背景色和前景的代码,可以发现:对于同一颜色,背景色代码=前景色代码+10
前景色代码 | 颜色 | 背景色代码 |
---|---|---|
30 | 黑色,注意和控制台的背景色稍有区别 | 40 |
31 | 红色 | 41 |
32 | 绿色 | 42 |
33 | 黄色 | 43 |
34 | 蓝色 | 44 |
35 | 紫色 | 45 |
36 | 青色 | 46 |
37 | 白色,但实际上是亮灰色 | 47 |
举例:
// ================escapeE.c文件===============
#include<stdio.h>
int main()
{
int i;
printf("前景色设置:30-37\n");
for(i=30;i<=37;++i){
printf("%d: \e[%dmHello World!\e[0m\n",i,i);
}
printf("背景色设置:40-47\n");
for(i=40;i<=47;++i){
printf("%d: \e[%dmHello World!\e[0m\n",i,i);
}
return 0;
}
注意:清除格式同样会恢复默认颜色。 为了上一行的设置不影响下一行的行号,故显示完Hello World
之后必须要用\e[0m
清除格式。
下面看在不同环境下的演示效果:
【虚拟机中的Ubuntu】
【FinalShell连接的CentOS】
综合举例
上面分别讲了基本格式控制、前景色控制、背景色控制,那如果同时完成三者的控制呢?很简单,只需在各控制码之间加个分号就好,代码如下:
#include<stdio.h>
int main()
{
int i;
// 带颜色的格式控制:0-9
printf("带颜色的输出格式设置:0-9\n");
for(i=0;i<=9;++i){
printf("%d: \e[42;31;%dmHello,World!\e[0m\n",i,i);
}
return 0;
}
虚拟机中的Ubuntu效果如下:
(这么大胆的配色,你喜欢吗?🧐)
3. 光标操作
使用以下代码执行控制台指令:
printf("\e%s", cmd);
其中cmd
是指令字符串:
指令字符串 | 作用 |
---|---|
c | 清除屏幕,不可恢复(相当于clear命令) |
[y;xH] | 将光标移至第x 列第y 行处 |
[nA | 将光标上移n 行 |
[nB | 将光标下移n 行 |
[nC | 将光标右移n 行 |
[nD | 将光标左移n 行 |
[K | 清除从光标(包括)到行末的内容 |
[s | 记录光标的位置(只能记一次) |
[u | 恢复光标的位置 |
[?25l | 显示光标 |
[?25h | 隐藏光标 |