终端能输出不同的颜色,本质上还是终端内置了识别带颜色命令的字符串。在shell中,如果使用echo来输出内容,默认是不带颜色,这是因为终端在处理默认echo的输出时,不认为里面有需要转义处理,里面的内容原样输出。通过echo -e打开转义功能,就可以先终端输出带颜色的内容了,其实除了带颜色的内容,还可以通过转义字符来输出其它内容,比如\t表示tab,\n表示换行等。可以更加灵活的控制输出内容。

颜色控制核心格式

颜色相关的转义核心格式如下:

1
"\033[31mXXXXXXXXXXXXXXXXXX\033[0m"

XXX表示其它正常的内容。其中\033[表示后面是表示关于终端的处理,而不属于内容的一部分。其后面可以跟的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
33[0m   关闭所有属性
33[1m 设置高亮度
33[4m 下划线
33[5m 闪烁
33[7m 反显
33[8m 消隐
33[30m 至 33[37m 设置前景色
33[40m 至 33[47m 设置背景色
33[nA 光标上移n行
33[nB 光标下移n行
33[nC 光标右移n行
33[nD 光标左移n行
33[y;xH 设置光标位置
33[2J 清屏
33[K 清除从光标到行尾的内容
33[s 保存光标位置
33[u 恢复光标位置
33[?25l 隐藏光标
33[?25h 显示光标

其中30m-37m 用来设置前景色,也就是文字的颜色。40m-47m用来设置背景色。

具体颜色表示是:

1
2
3
4
5
6
7
8
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色

背景色在相应的颜色上加10即可,具体颜色不用记,真要用时测试下就知道了。

以上的格式控制是可以多个同时叠加的,以达到对终端输出地复杂控制 。

利用printf命令输出

前面只是描述了用终端处理接收到的特殊字符的原理,在shell里通常可以用echo -e命令来输出,同样也可以用printf命令来输出。比如,如下的代码:

1
2
printf "[%10s]:    PID->%-5s     CPU->%-4s      MEM->%-7s     STAT->%-3s \
[\033[32m%7s\033[0m]\n" "$1" "$PID" "$CPU" "$MEM" "$STAT" "Running"

可以看的出来,只要在字符串里写入相关的格式字符串即可。

printf命令的用法跟C语言的函数很像,可以作为SHELL脚本里比Shell更加灵活的控制格式化输出。上述代码中,%s表示输出字符串,5表示字符串占用5位,不足5位默认右对齐,使用-表示字符串不足5位的使用左对齐。同样的,我们可以控制输出浮点格式的数据,可以指定精度和位数。

C语言中的输出

C语言的printf函数可以向标准输出打印内容,其打印的内容同样在终端上显示,因此也同样的受终端显示规则的影响。使用上述各式的字符串,可以用来输出颜色。甚至其它语言都可以利用这个原理来控制输出的颜色。