日期:2014-05-16 浏览次数:20697 次
编写shell脚本的时候,通过改变shell的显示颜色,不但能够改变使用shell终端的体验,而且更为实用的是,能够通过改变显示内容的颜色来区分正常输出,warning和error等不同关注级别的输出内容。
1、转义序列(Escape sequence)
An escape sequence is a series of characters used to change the state of computers and their attached peripheral devices. These are also known as control sequences, reflecting
their use in device control. Some control sequences are special characters that always have the same meaning. Escape sequences use an escape character to change the meaning of the characters which follow it, meaning that the characters can be interpreted as
a command to be executed rather than as data.
简单地说,就是转义序列能够改变电脑和外设的状态。这里用的就是利用转义字符来改变显示器的显示颜色。
2、echo命令
echo命令中有-e选项,通过这个选项,可以在该条命令中开启对反斜杠转义的解释,后面的选项中追加适当的转义序列可以改变echo命令输出的显示颜色。echo中文字显示颜色相关的参数主要有三个Style,Frontground和Background,每个参数有7个值具体的格式如下:
Style Foreground Background 1st Digit 2nd Digit 3rd Digit 0 - Reset 30 - Black 40 - Black 1 - FG Bright 31 - Red 41 - Red 2 - Unknown 32 - Green 42 - Green 3 - Unknown 33 - Yellow 43 - Yellow 4 - Underline 34 - Blue 44 - Blue 5 - BG Bright 35 - Magenta 45 - Magenta(洋红色) 6 - Unknown 36 - Cyan 46 - Cyan(蓝绿色) 7 - Reverse 37 - White 47 - White
通过将命令echo -e "\e[Style;Foreground;BackgroundmTHINGSTOPRINT"中的Style、Foreground和Background换成上面的数字就可以改变后面THINGSTOPRINT的显示颜色。比如,$ echo -e "\e[1;32;43mHello World! "的运行结果如图1。
图1
注:这里之所以Hello World!最后的叹号后面加一个空格,是因为unix shell中叹号是保留字符,用来调用历史命令。比如!cmd就执行上一条执行过的cmd开头的命令,而!cmd:p则是只是将上一条cmd开头的命令唤出显示出来,而不执行。
可以发现这样的话,后续所有行的shell显示颜色都会被改变,这往往不是我们想要的,所以一般来说,我们会在这种命令的末尾将这些显示设置给Reset。同时,为了不被上一次命令影响,也会在之前设置style的值来进行开始设置之前的reset。(当然,如果要将style设置成underline或者FGorBG Bright之类的值得时候,就没法在开始设置之前进行reset了,但是,最后的reset是无论如何都是必要的,除非你想接下来所有的显示一直采用当前的设置。)下面几条命令的运行结果如下图2。
命令:
echo -e "\e[1;32;43mHello World! \e[0m" echo -e "\e[0;32;43mHello World! \e[0m" echo -e "\e[4;32;43mHello World! \e[0m" echo -e "\e[5;32;43mHello World! \e[0m"
3、打印所有显示效果的脚本
脚本test.sh的内容: #/bin/bash for TYLE in 0 1 2 3 4 5 6 7; do for FG in 30 31 32 33 34 35 36 37; do for BG in 40 41 42 43 44 45 46 47; do CTRL="\033[${STYLE};${FG};${BG}m" echo -en "${CTRL}" echo -n "${STYLE};${FG};${BG}" echo -en "\033[0m" done echo done echo done #Reset echo -e "\033[0m"
注:这里改脚本中用到了echo的-n选项,它的作用就是控制不要再输出内容的后面追加换行,与之对应的只有一个echo的命令就是简单地输出一个空行,达到换行的目的。
sh test.sh运行该脚本,就可以看到彩虹般的结果,如图3(结果有点长,这里只截取了一部分)。
图3 彩虹