分类: LINUX
2010-05-25 18:48:35
ANSI 控制码
今天编写了一个shell脚本, 输出结果中一些比较重要的内容和其他的信息堆在一起, 看起来很不明显. 可我不喜欢给输出中加上一大堆的诸如"+", "*", "="之类的字符来区分, 想起以前见过某个程序安装脚本在输出结果中就有一些关键信息用其他颜色来突出显示, 搜索才发现, 原来都可以通过ANSI控制码实现.
先看下面的命令和输出结果:
对比即可发现,
两条命令差别就在于这些字符串”\e[32m”,
“\e[33m”, “\e[m”. 其实这都是ANSI的控制码.
这些控制码不仅能使用在linux的shell环境,
一些BBS,
甚至于C程序可使用,
不过其他情况下,
输入需要一些技巧,下面 会详细讲到.
在ANSI控制码中,”\e[”是标准ANSI控制码的开始标志, “\e”是ASCII值为27(0x1B)的字符, 也就是键盘上常见的ESC键, 只是大多数系统上该字符的输入比较麻烦, “\e”实际上是一个转义字符, 也可以使用”\033” (八进制033 = 十进制27)来表示, 即上边的命令换成echo -e "\033[32mHello,\033[33m world.\033[0m", 效果是一样的. 说明一点“\e[0m”和”\e[m”是一样, 如果m前没有数值, 则默认为0.
在BBS中输入ESC字符, 有一个技巧, 比如在Windows下可以在cmd中按住ALT的同时在小键盘输入27, 使用命令 echo “ALT+27(小键盘)” > test.txt, 那么打开test.txt后就会有一个控制字符, 可能会显示成一个方块之类的, 没关系, 直接复制并粘贴到需要出现ESC的地方. 其实通过二进制编辑器就可以看到该字符的十六进制值是0x1B.
最后,
C程序中的技巧,
使用格式控制来实现,
例如:
printf(“%c[33mHello,
world.%c[m”, 0x1b, 0x1b);
这条语句的结果会以彩色方式输出, 见下图:
注意:
如果使用ANSI格式控制码修改了现实颜色后, 除非重新恢复(即\e[m), 否则会一直以之前设置的颜色显示所有内容.
光标控制:
控制码 |
说明 |
[X;YH |
将光标移至第 X 行,第 Y 列的位置 |
[nA |
光标上移 n 列。<<若至屏幕顶端则无效>> |
[nB |
光标下移 n 列。<<若至屏幕底端则无效>> |
[nC |
光标向右 n 行。<<若已至屏幕最右端则无效>> |
[nD |
光标向左 n 行。<<若已至屏幕最左端则无效>> |
[6n |
报告光标位置 |
[s |
保存目前的光标位置 |
[u |
取出保存的光标位置来使用 |
屏幕控制:
控制码 |
说明 |
[2J |
清除屏幕。 <<功能和 DOS 的 CLS 命令一样>> |
[K |
将光标位置开始至本列结束的所有字符清除 |
显示字符属性控制:
控制码 |
说明 |
[n1;n2;......m |
Ⅰ设定显示字符的属性状态 Ⅱ若有两个以上的属性状态要设定则以分号将代码(n1;n2;..)隔开 Ⅲ除非重新设定,否则原设定之属性一直被保留 |
代码 |
意义 |
|
0 |
所有属性 OFF,即返回正常显示模式 (Normal) |
|
1 |
高亮度显示 (Bright) |
|
4 |
加下划线 (Underline) |
|
5 |
闪烁显示 (Flash) |
|
7 |
反相显示 (Inverse) |
|
8 |
不可见 (Invisable) |
|
前景 |
背景 |
颜色 |
30 |
40 |
黑色 |
31 |
41 |
红色 |
32 |
42 |
绿色 |
33 |
43 |
黄色 |
34 |
44 |
蓝色 |
35 |
45 |
紫红色 |
36 |
46 |
青蓝色 |
37 |
47 |
白色 |
字体控制:
控制码 |
说明 |
[0I |
恢复正常字体 |
[1I |
宋体 |
[2I |
黑体 |
[3I |
楷体 |
特殊控制:
控制码 |
说明 |
[G |
响铃 |
[nU |
URL确认(n个字节) |
[nM |
延时(n为微秒数) < |
其实, linux有两个系统级的变量, 也是可以通过这种控制码来修改色彩的, 即'PS1'和'LS_COLORS', 这两个变量的具体作用就不多说了, 可以google之...
-----参考信息: