
背景
在日常操作Linux的情况下,总会遇到一些需求,比如说,把输出的内容用不同颜色标注出来,以达到醒目、提示的目的,那么如何在Linux终端输出带有颜色的字体呢?
Linux终端输出字符颜色
在Linux下,ANSI 转义序列会设置终端的显示属性,终端的字符颜色由转义序列(Escape Sequence)控制,是文本模式下的系统显示功能,与具体语言无关。所以,这意味着,在Linux终端,你可以使用Shell,Python,PHP,Java,awk的printf等等来输出带有颜色的字符。
转义序列(转义字符)以控制字符'ESC'作为开头,该控制字符ESC(Escape),意为退出,转换,在计算机中,它一般表示转义。它的ASCII码十进制表示为27
,十六进制表示为0x1B
,八进制表示为033
,脱出字符表示为^[
。由于多数的转义序列超过两个字符,所以它常与一个左中括号[
组成控制序列引导符(CSI,Control Sequence Intro )。这样,我们就见到了Linux输出带有颜色的字符时用到的它们( 'ESC'[
),可能你不是很能认得出它们现在的样子,那是因为我们常用到的多是 \033[
和 \e[
。
应该怎么实现这些带有颜色的字符,我们怎么去通过转义序列设置终端的显示属性呢?常见形式如下:
^[[属性参数;属性参数m字符内容 # ^[为'ESC'的脱出字符表示
\033[属性参数;属性参数m字符内容 # \033为'ESC'的八进制表示
\e[属性参数;属性参数m字符内容
\x1B[属性参数;属性参数m字符内容 # \x1B为'ESC'的十六进制表示,也可以是\x1b
以上的内容,其中属性参数前面的,即控制序列引导符,由各种形式的'ESC'
与 [
构成;'ESC'的脱出字符怎么得到?需要按住键盘的Ctrl键,再依次按v键与左中括号[键,即ctrl+v
ctrl+[
属性参数就是我们想要转义序列设置终端输出显示属性的参数值,各个属性参数之间分号分隔。它们由以下这些内容组成:
- 显示格式:0(默认系统属性)、1(字体粗体/高亮)、22(非粗体)、4(字体下划线)、24(无下划线)、5(字体闪烁)、25(无闪烁)、7(字体反显,翻转设置的前景色和背景色)、27(无反显)
- 显示颜色:0(黑)、1(红)、2(绿)、 3(黄)、4(蓝)、5(洋红)、6(青)、7(白)
- 前景色:30 + 颜色值
- 背景色:40 + 颜色值
m表示设置属性并结束转义序列,此时终端的显示属性便设置为m前的参数值
为什么总是在字符内容后面有一组转义序列,并且还都是 'ESC'[0m
呢?看以下这个情况便知道了
当我们设置了具体参数后,系统终端的显示属性便会一直为我们设置的值,此时需要参数0来恢复系统默认,这样,后续的输出便不会受到影响了。
小例子
带有颜色的select语句
#!/bin/bash
color[0]='默认'
color[1]=$'\033[31m红色\033[0m'
color[2]=$(echo -e "\e[32m绿色\e[0m")
color[3]=`echo -e "\x1b[33m黄色\x1b[0m"`
color[4]="^[[34m蓝色^[[0m"
color[5]="exit"
PS3="请选择你的^[[47;4;31m选项^[[0m:"
select i in ${color[@]}
do
if [ "$i" == "${color[5]}" ];then
exit 0
else
echo "$i"
fi
done
exit 0
输出结果:
这里,我们用到了上面介绍的用法,还用到了 $''
的方式来代替$(echo -e)
赋值带有颜色的变量,可以看到的是,^[
的适用性很强,\033[
与 \e[
的适用性较差,但可以通过echo -e 并赋值的方式实现,对了,是可以在同一段文字中加入不同颜色的,千万不要认为只能改变一整段内容,中间夹杂默认字符,需要使用参数0来恢复默认。
$''
的具体原理是什么,我暂时不得而知,希望有知道的大佬指出。现在,我们可以输出这些带有颜色的字符了,并且,我们可以把这些字符赋值给变量,带入数组,编写一些输出颜色的提示之类的。不过要注意一下,带有颜色的字符,在逻辑判断的时候,与不带颜色的是不同的,所以你的判断没有起作用,很可能是拿两者直接比较了。