背景

​ 在日常操作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. BackGroundWorker组件使用、Winform控件的Invoke安全调用

    BackgroundWorker是·net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作. 可以通过编程方式创建 BackgroundWorker,也可以将它从"工具 ...

  2. Oracle-锁的查询和处理

    1.查出锁定object的session的信息以及被锁定的object名 SELECT L.SESSION_ID SID, S.SERIAL#, L.LOCKED_MODE, L.ORACLE_USE ...

  3. jQuery于js的区别和联系

    一.什么是jQuery jQuery 是 js 的一个库,封装了我们开发过程中常用的一些功能,方便我们调用,提高开发效率. js库是把我们常用的功能放到一个单独的文件中,我们用的时候,直接引用到页面里 ...

  4. [Python自学] day-22 (1) (Session、CSRF、中间件)

    一.响应函数补充 三种返回响应的方式: return HttpResponse() return render() return redirect() HttpResponse: 除了能够返回字符串, ...

  5. Java 相同类型强制转换异常

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u010750497/article/det ...

  6. 显示浏览访客的IP

    jQuery(function($){    var url = 'http://chaxun.1616.net/s.php?type=ip&output=json&callback= ...

  7. 数据库学习之四--Join, Left Join, Right Join, Full Join对比

    一.Join, Left Join, Right Join, Full Join区别: 二.查询对比 1. 创建表Persons和Orders,并插入数据: CREATE TABLE `persons ...

  8. leetcode解题报告(5):Longest Consecutive Sequence

    描述 Given an unsorted array of integers, find the length of the longest consecutive elements sequence ...

  9. 1632:【 例 2】[NOIP2012]同余方程

    #include<bits/stdc++.h> #define ll long long using namespace std; void Exgcd(ll a,ll b,ll & ...

  10. oc Learning Blog

    http://www.cnblogs.com/heyonggang/p/3351269.html M了个J :http://www.cnblogs.com/mjios/tag/objective-c/ ...