想看字的大小正常的版本,请将全文粘贴至WORD,自动就变成正常的字体了。
期末课程设计
在Bash下输出彩色的文本
关键字 shell bash 彩色 管道 重定向 awk
我们知道,Linux下的Bash里的命令ls默认是开启颜色显示的,用各种颜色来区分不同的文件类型,这说明Bash内置了彩色显示的功能。Bash不是GUI而是CLI,许多电脑高手都偏爱CLI,因为那种亲自以语句操纵世界的感觉无以伦比。可是,请想象一下,在没有语法高亮的情况下编写成千上万行的代码,那是什么感觉?编程会变成一种精神的折磨,并且极大提高出错率。
我研究在bash下输出彩色的文本的初衷,是想使自己在写一些Shell脚本时,能够在用户界面上做得漂亮些。后来,由于发现英文文献上介绍的方法有错漏之处,也很不人性化,于是不断调试,不断改进,最终我写出了一个支持命令行参数、管道和stdin重定向为文件,并具有较高容错性能的脚本。脚本本身的使用价值未必特别高,但在编写的过程中,为了达到我需要的目的,对Bash进行了大量试探,对它的许多特性有了深入的了解,并对许多问题形成了一整套的解决方案,为以后的其他应用的打下了基础。
§1 echo的-n和-e选项
输出彩色的文本,我们使用的命令是echo。大家都知道echo可以显示一些字符串,可以显示一些变量。例如:
[root@VMFedora5 ~]# echo 'Hello! Here is the content!'
Hello! Here is the content!
[root@VMFedora5 ~]# var1="The number"
[root@VMFedora5 ~]# var2=7
[root@VMFedora5 ~]#echo "$var1 is $var2 ."
The number is 7 .
首先我们来了解一下-n这个选项,它的意思是让echo别换行。例如
[root@VMFedora5 ~]#echo -n "Don't return:"
Don't return:[root@VMFedora5 ~]#
这个选项很有用。这样就可以在一行里显示五彩缤纷的字了。
然后我们来了解一下-e这个选项。这个选项是彩色的灵魂,加了这个选项,echo就要开始认一些转义字符。用英语说就叫enable escape sequence.
例如
echo -e "/034"
这就是-e的作用了。
我写了个脚本试试,从/000试到/777。为什么只试到/777呢?因为这里用的其实是8进制的数。例如:
#!/bin/bash
for (( i=0;i<=7;i=i+1 ))
do
for (( j=0;j<=7;j=j+1 ))
do
for (( k=0;k<=7;k=k+1 ))
do
echo -n "$i$j$k "
echo -en "//$i$j$k "
done
echo
done
done
这个脚本的编写中最激动人心的是echo -en "//$i$j$k "这一句,因为编程都是希望能够节省劳动,所以希望Bash能够自动化生成一些处理方式。比如这句命令里,Bash因为””而将//变成/,$i、$j、$k变成相应的数字,然后-e选项又将,比如,/546变成了相应的特殊字符输出。在这种试探的过程中,我们窥见了echo背后的运行机理。
§2 用转义字符输出彩色文本
我先说明一下我是怎么介绍一个命令的。黑体的,代表命令中固定的部份;下标的只是一个说明,代表这里这里会有几种选择,我会在后面注明所有的选择。
好了,这就是,彩色的完整命令:
echo -e "/E[3FgColor;4BgColorm""/033[turn_onmcontent/033[turn_offm"
看到有点晕吧?
/E[ 的意思是:嗯,我要开始定义前景背景色了。
3代表是前景色,4代表是背景色。顺序不能颠倒。
FgColor 和 BgColor 的选择有:
0 黑色
1 红色
2 绿色
3 黄色
4 蓝色
5 洋红
6 青
7 灰色
8、9 白色
;是用来分割前景色和背景色的。
m是说,嗯,前景背景色定义完了。
/033[加上turn_on和m,意思是:嗯,我要开始用刚才定义的前景背景色写字了。后面紧跟着要写的内容content。
/033[加上turn_off和m,意思是:嗯,我写完了。
turn_on的选择有:
1 淡些、粗些
4 下划线
7 反相(颠倒前景色和背景色)
9 删除线
2、3、5、6、8 正常
turn_off的选择,只有一个:0
以上这些选择的效果,是我依据英文文献一个一个调试出来的,英文文献上漏了一些颜色,也没有提到turn_on的那么多选择。在具体的调试中,我还发现turn_on选项的结果有时会因FgColor 和 BgColor 的选择而发生细微的变化,尤其是在涉及到白色、灰色的时候。不过这是细节,就不举例子了。
我们来试一试输出前景红色背景白色的"Red":
[root@VMFedora5 ~]# echo -e "/E[31;49m""/033[5mRed/033[0m"
Red
§3 试用脚本输出彩色文本
难道我们每次都些这么辛苦吗?会折磨死人的……
我发现,下面这段代码的效果与上面是一样的
[root@VMFedora5 ~]#i=31
[root@VMFedora5 ~]#j=49
[root@VMFedora5 ~]# echo -e "/E[""$i;$j""m""/033[""1""m""Red""/033[""0""m"
Red
这就意味着我们可以将每个控制单元分别设成变量,然后写一个Shell脚本,来代替这种笨拙的方式。
先写一个简单的,实现刚才那个效果的Shell脚本。
[root@VMFedora5 ~]# vi Color.sh
[root@VMFedora5 ~]# cat Color.sh
#!/bin/bash
#"Colorizing" Scripts
function Color()
{
Fg="3""$1"
Bg="4""$2"
SetColor="/E[""$Fg;$Bg""m"
UseColor="/033[""$3""m"
Content="$4"
EndColor="/033[0m"
echo -en "$SetColor""$UseColor""$Content""$EndColor"
}
Color 1 9 5 Red
[root@VMFedora5 ~]# chmod +x Color.sh
[root@VMFedora5 ~]# ./Color.sh