日期:2014-05-16  浏览次数:20697 次

unix改变shell显示颜色

编写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"


图2 运行结果

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 彩虹