花里胡哨,如何在Linux终端输出带有颜色的字体,将带颜色的字体赋值给变量

背景

​ 在日常操作Linux的情况下,总会遇到一些需求,比如说,把输出的内容用不同颜色标注出来,以达到醒目、提示的目的,那么如何在Linux终端输出带有颜色的字体呢?

Linux终端输出字符颜色

​ 在Linux下,ANSI 转义序列会设置终端的显示属性,终端的字符颜色由转义序列(Escape Sequence)控制,是文本模式下的系统显示功能,与具体语言无关。所以,这意味着,在Linux终端,你可以使用Shell,Python,PHP,Java,awk的printf等等来输出带有颜色的字符。

花里胡哨,如何在Linux终端输出带有颜色的字体,将带颜色的字体赋值给变量

​ 转义序列(转义字符)以控制字符'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前的参数值

花里胡哨,如何在Linux终端输出带有颜色的字体,将带颜色的字体赋值给变量

为什么总是在字符内容后面有一组转义序列,并且还都是 'ESC'[0m 呢?看以下这个情况便知道了

花里胡哨,如何在Linux终端输出带有颜色的字体,将带颜色的字体赋值给变量

当我们设置了具体参数后,系统终端的显示属性便会一直为我们设置的值,此时需要参数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

输出结果:

花里胡哨,如何在Linux终端输出带有颜色的字体,将带颜色的字体赋值给变量

​ 这里,我们用到了上面介绍的用法,还用到了 $'' 的方式来代替$(echo -e) 赋值带有颜色的变量,可以看到的是,^[ 的适用性很强,\033[\e[ 的适用性较差,但可以通过echo -e 并赋值的方式实现,对了,是可以在同一段文字中加入不同颜色的,千万不要认为只能改变一整段内容,中间夹杂默认字符,需要使用参数0来恢复默认。

$'' 的具体原理是什么,我暂时不得而知,希望有知道的大佬指出。现在,我们可以输出这些带有颜色的字符了,并且,我们可以把这些字符赋值给变量,带入数组,编写一些输出颜色的提示之类的。不过要注意一下,带有颜色的字符,在逻辑判断的时候,与不带颜色的是不同的,所以你的判断没有起作用,很可能是拿两者直接比较了。

上一篇:linux 终端输出颜色


下一篇:记录终端输出的LOG到文件