在Bash下输出彩色的文本

本文详细介绍了如何在Bash环境下通过echo命令和转义字符输出彩色文本,包括理解-n和-e选项,使用转义字符创建彩色命令,编写支持参数、管道和stdin重定向的脚本,以及处理错误和接受带空格的字符串。文章还分享了作者在编写过程中对Bash的深入理解和技巧,旨在提升Shell脚本的用户体验。
摘要由CSDN通过智能技术生成

想看字的大小正常的版本,请将全文粘贴至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     灰色

89   白色

是用来分割前景色和背景色的。

m是说,嗯,前景背景色定义完了。

/033[加上turn_onm,意思是:嗯,我要开始用刚才定义的前景背景色写字了。后面紧跟着要写的内容content

/033[加上turn_offm,意思是:嗯,我写完了。

turn_on的选择有:

1     淡些、粗些

4     下划线

7     反相(颠倒前景色和背景色)

9     删除线

23568     正常

 

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值