from: http://blog.sina.com.cn/s/blog_502c8cc401012opd.html
大家在终端中用ls命令查看文件的时候,不同类型的文件会显示成不同的顔色,一般来说,蓝色:表示这是一个目录。浅蓝色表示这是一个链接文件,绿色表示这是一个可执行文件,黄色表示这个一个设备文件,等等。通过echo LS_COLORS 或 dircolors命令可以查看这些关顔色的设置。
而我们在终端中运行自己写的脚本或程序时,一般只会显示单一的默认字体顔色。如果想要实现多种顔色的及不同格式的输出的话,就要用到linux控制字符及转义字符串。
如果一个字符的编码在进行字符映射表转换之前是00 (空字符), 07 (响铃), 08 (退格), 09 (水平制表符), 0a (换行), 0b (垂直制表符), 0c (换页), 0d (回车), 0e (不用切换), 0f (启用切换), 18 (取消), 1a (替补), 1b(ESC键), 7f (删除)中的一个,那么它就是一个控制字符,这里我们需要关注的是1b,1b是ESC键对应的值(运行xev命令然后按ESC可以看到X系统发出一个字节1b),ESC表示一个新的转义序列的开始,这可能导至前一个序列的终止,使用上述的18和1A也会终止一个转义序列。转义序列的功能很多,如选择字符集,控制光标,控制背景色,前景色等。
通过man console_codes 可以查看这些功能的详细说明。
这里,我们找几个有意思的来试验。
在终端中输入 echo -e "\x1b[2J"
可以看到终端中的内容被清空了。其中-e 是开启字符转义, "\x1b" 是ESC的16进制ASCII码值,这里也可经表示成八进制的\033,[是一个CSI(Control sequence introducer),转义序列的作用由最后一个字符决定的,这里J表示删除,默认情况下它删除从当前光标处到行尾的内容,这里的2为参数,它表示删除所有的显示内容。也可以使用printf "\x1b[2J"。
echo -e "\x1b[34m"
它把终端的前景色设置为34(蓝色)m表示设置属性。
echo -e "\x1b[43m"
它把终端的背景色设置为43(棕色)
echo -e "\x1b[43m\x1b[12H\x1b[14C\x20\x1b[0m"
它把前景色设置为棕色,然后把光标移动到12行(\x1b[12H)、14列(\x1b[14C)的位置,接着打印一个空格(\x20),然后用参数"0"恢复默认设置(\x1b[0m)。显示效果是在终端的12行14列的位置打印了一个棕色的方框。
把上面这此东西组合起来可以实现非常有意思的功能。如下面这个shell脚本会在终端中显示一个T状的图形,从左上角向右下角移动。
#!/bin/bash
green="\x1b[42m";
default="\x1b[0m";
color=$green;
put_T()
{
echo -e "\x1b[2J\x1b[""$1""H";
mov="\x1b["$2"C";
T=$mov$color"\x20\x20\x20\x20\x20\x20"$default"\x0a$mov\x20\x20"$color"\x20\x20"$default"\x20\x20";
echo -e "$T";
}
for((i=1;i<20;i++));do
{
H=$i;
off=$(expr $i + 2);
put_T $i $off;
echo -e "\x1b[21H";
}
sleep 0.4;
done
感觉很像俄罗斯方块里的一部分,如果有兴趣的话可以想办法把这个扩展成一个俄罗斯方块哦。