本文共 1548 字,大约阅读时间需要 5 分钟。
from:
大家在终端中用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
感觉很像俄罗斯方块里的一部分,如果有兴趣的话可以想办法把这个扩展成一个俄罗斯方块哦。
转载地址:http://ezbxi.baihongyu.com/