背景

​ 在日常操作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来恢复默认。

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

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

  1. 通过printf设置Linux终端输出的颜色和显示方式

    转载自:http://www.cnblogs.com/clover-toeic/p/4031618.html 在Linux终端下调试程序时,有时需要输出大量信息.若能控制字体的颜色和显示方式,可使输出 ...

  2. linux 终端输出颜色

    在Linux终端下调试程序时,有时需要输出大量信息.若能控制字体的颜色和显示方式,可使输出信息对比鲜明,便于调试时观察数据. 终端的字符颜色由转义序列(Escape Sequence)控制,是文本模式 ...

  3. 花里胡哨之自定义linux终端前缀显示

    文章目录 1.先看默认的linux终端前缀 2.查看默认的终端前缀变量 3.符号所代表的意义 4.修改PS1变量,达成自定义效果 4.1.只显示主机名和完整目录 4.2.给他点颜色看看 5.谢幕 1. ...

  4. 如何在 Linux 终端中知道你的公有 IP

    导读 在本文中我将会介绍在几种在 Linux 终端中查看你的公有 IP 地址的方法.这对普通用户来说并无意义,但 Linux 服务器(无GUI或者作为只能使用基本工具的用户登录时)会很有用.无论如何, ...

  5. 如何在linux终端创建文件

    我们都知道可以用mkdir命令创建一个新的目录,但更多时候如果能直接创建一个文件(普通文件)会让人感觉更愉悦:这样就可以不用在去打开一个专门的创建文本文件的软件,然后还要设置文件名,保存路径那样的繁琐 ...

  6. 如何在 Linux 终端下创建新的文件系统/分区

    在 Linux 中创建分区或新的文件系统通常意味着一件事:安装 Gnome Parted 分区编辑器(GParted).对于大多数 Linux 用户而言,这是唯一的办法.不过,你是否考虑过在终端创建这 ...

  7. Linux终端复用神器-Tmux使用梳理

    Tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权.使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“ ...

  8. 在Linux终端中查看公有IP的方法详解

    首先回顾一下一般的查看IP的命令: ifconfigLinux查看IP地址的命令--ifconfigifconfig命令用于查看和更改网络接口的地址和参数 $ifconfig -a  lo0: fla ...

  9. linux 终端控制-- 多彩输出 格式排版

    linux 终端控制-- 多彩输出 格式排版 在unix/linux的终端下,怎么控制终端输出的颜色和格式呢,当然了有专门的工具,tput,但是能被terminal直接读懂的格式化字符串更通用. 先来 ...

随机推荐

  1. gRPC 到 JSON 代理生成器 grpc-gateway

    grpc-gateway是protoc的插件,它读取protobuf服务定义并生成反向代理服务器,该服务将RESTful HTTP API转换为gRPC. 这个服务是根据你的服务定义中的google. ...

  2. ACM-ICPC 2018 青岛赛区现场赛 K. Airdrop && ZOJ 4068 (暴力)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4068 题意:吃鸡游戏简化为二维平面上有 n 个人 (xi,yi) ...

  3. 行内元素进行绝对(absolute),固定(fixed)定位后会变成块级元素·

    行内元素进行绝对定位后会变成块级元素· position:absolute; <!DOCTYPE html><html lang="en"><head ...

  4. Python 11--文件流

  5. 下载文件设置header的filename要用ISO8859-1编码的原因

    很多情况下,我们在写程序的时候都会把代码设置为UTF-8的编码,可以在下载文件设置filename的时候却有违常理,竟然设置编码格式为ISO8859-1,代码如下(如是英文的话就不需要这样处理了): ...

  6. oracle数据库外连接

    外连接作用:(左外连接和右外连接;注:没有全外连接) 希望把某些不成立的记录(40号部门),仍然包含在最后的结果中 左外连接:当where e.deptno=d.deptno不成立的时候,等号左边的表 ...

  7. [2]windows内核情景分析--系统调用

    Windows的地址空间分用户模式与内核模式,低2GB的部分叫用户模式,高2G的部分叫内核模式,位于用户空间的代码不能访问内核空间,位于内核空间的代码却可以访问用户空间 一个线程的运行状态分内核态与用 ...

  8. 3-自定义构造方法和description方法

    http://www.cnblogs.com/mjios/archive/2013/04/19/3031412.html -自定义构造方法和description方法 1 默认的构造方法是什么?有什么 ...

  9. make 和 make install 的区别

    简单来说,make 是编译,make install 是安装. 总结:linux编译安装中configure.make和make install各自的作用 ./configure是用来检测你的安装平台 ...

  10. 去除IntelliJ IDEA对重复代码的检测

    方法1:  方法2:(比较简便)