如何在终端中打印带颜色的文本

echo命令


echo是终端下最常用的命令之一,用于在显示器上显示一段文字。一般格式为: echo [ -option ] 字符串

它有2个常用的选项,一个是-n,另一个是-e,下面的图就是 man echo 的结果:

image

echo将字符串输出后是会自动换行的,如果不想换行就需要加上-n选项。

-e的作用是强大的,想要输出有颜色的文字就不得不用借助于-e了。为什么要带颜色?看看下图就知道了

image

都是毛大头,快速辨别的方法就是看数字和颜色。如若看不到数字,单看颜色也能一眼辨别。

 

-e:启用反斜线控制字符的转换,echo 命令所支持的反斜线控制字符如下图:

image

\\:反斜线本身
\a:ALERT / BELL (从系统喇叭送出铃声)
\b:BACKSPACE,退格键
\c:取消行末换行符号(跟-n的作用一样)
\e:ESCAPE键
\f:FORMFEED,换页字符
\n:NEWLINE,换行字符
\r:RETURN,回车键
\t:TAB,表格跳位键
\v:VERTICAL TAB,垂直表格跳位键
\0NNN:ASCII 八进位编码
\xHH:ASCII 十六进位编码

 

# echo $?
//显示最后运行的命令的结束代码(返回值)

 

give you some color see see


在终端可以这样做:

echo -e "\033[31mhello"
echo -e "\033[31mhello\033[0m"

\e[0m会将颜色重新置回,什么时候想重置就什么时候加。

 

echo -e "\033[31mhello"
echo -e "\e[31mhello"

显示的效果是一样的,因为\033和\e是一样的。怎么一样呢?

echo -e "\e"    // 表示键盘左上角的Esc键
echo -e "\033"  // 八进制转义,表示Esc键
echo -e "\x1b"  // 16进制转义,表示Esc键

 

echo -e "\e[31mhello"
echo -e "\e[32mhello"

控制前景色的就是31这个位置的具体数字。

 

另外,GitHub上一个叫cecho的项目,能够方便地实现彩色打印。

 

在C程序中可以这样做:

#include <stdio.h>
int main()
{
    printf("\033[35mabc\n");
    printf("\e[31mdef\e[0m\n");
}

运行后可以看到紫色的abc和红色的def:

 

 

why?


终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能。

和具体的语言无关,所以C语言中的 printf/fprintf 函数也可以这样使用。

本文最重要的一句话,所有的问题都在这里,看明白了就知道怎么改变文本的显示方式了:

\033[显示方式;前景色;背景色m

把\033换成\e是一样的:

\e[显示方式;前景色;背景色m

解释:

①颜色的转义序列是以 ESC 开头

②显示方式:0(默认值)、1(高亮)、

22(非粗体)、4(下划线)、24(非下划线)、5(闪烁)、25(非闪烁)、7(反显)、27(非反显)

③前景色:

30(黑色)、31(红色)、32(绿色)、 33(黄色)、34(蓝色)、35(洋红)、36(青色)、37(白色)

④背景色:

40(黑色)、41(红色)、42(绿色)、 43(黄色)、44(蓝色)、45(洋红)、46(青色)、47(白色)

⑤\033[0m表示默认,可以关闭前边设置的任何效果

image

 

注意:echo的字符串这时必须用引号括起来。

image

 

\033[ 的其他格式


 \033[nA   光标上移n行 
\03[nB    光标下移n行 
\033[nC   光标右移n行 
\033[nD   光标左移n行 
\033[y;xH 设置光标位置 
\033[2J   清屏 
\033[K    清除从光标到行尾的内容 
\033[s    保存光标位置 
\033[u    恢复光标位置 
\033[?25l 隐藏光标 
\33[?25h  显示光标

 

C语言的 printf 函数也好色


 为了人性化地在 printf 函数中进行着色输出,可以定义成一系列的宏。下边的宏定义不是我写的,来自这篇博客:

http://www.cnblogs.com/clover-toeic/p/4031618.html

#define NONE                 "\e[0m"
#define BLACK                "\e[0;30m"
#define L_BLACK              "\e[1;30m"
#define RED                  "\e[0;31m"
#define L_RED                "\e[1;31m"
#define GREEN                "\e[0;32m"
#define L_GREEN              "\e[1;32m"
#define BROWN                "\e[0;33m"
#define YELLOW               "\e[1;33m"
#define BLUE                 "\e[0;34m"
#define L_BLUE               "\e[1;34m"
#define PURPLE               "\e[0;35m"
#define L_PURPLE             "\e[1;35m"
#define CYAN                 "\e[0;36m"
#define L_CYAN               "\e[1;36m"
#define GRAY                 "\e[0;37m"
#define WHITE                "\e[1;37m"

#define BOLD                 "\e[1m"
#define UNDERLINE            "\e[4m"
#define BLINK                "\e[5m"
#define REVERSE              "\e[7m"
#define HIDE                 "\e[8m"
#define CLEAR                "\e[2J"
#define CLRLINE              "\r\e[K" //or "\e[1K\r"

使用时就像这样:

printf(RED "RED " L_RED "L_RED\n" NONE);

 

附录-ASCII码表


ASCII码表
八进制十六进制十进制字符八进制十六进制十进制字符
00000nul1004064@
01011soh1014165A
02022stx1024266B
03033etx1034367C
04044eot1044468D
05055enq1054569E
06066ack1064670F
07077bel1074771G
10088bs1104872H
11099ht1114973I
120a10nl1124a74J
130b11vt1134b75K
140c12ff1144c76L
150d13cr1154d77M
160e14so1164e78N
170f15si1174f79O
201016dle1205080P
211117dc11215181Q
221218dc21225282R
231319dc31235383S
241420dc41245484T
251521nak1255585U
261622syn1265686V
271723etb1275787W
301824can1305888X
311925em1315989Y
321a26sub1325a90Z
331b27esc1335b91[
341c28fs1345c92\
351d29gs1355d93]
361e30re1365e94^
371f31us1375f95_
402032sp1406096'
412133!1416197a
422234"1426298b
432335#1436399c
442436$14464100d
452537%14565101e
462638&14666102f
472739`14767103g
502840(15068104h
512941)15169105i
522a42*1526a106j
532b43+1536b107k
542c44,1546c108l
552d45-1556d109m
562e46.1566e110n
572f47/1576f111o
603048016070112p
613149116171113q
623250216272114r
633351316373115s
643452416474116t
653553516575117u
663654616676118v
673755716777119w
703856817078120x
713957917179121y
723a58:1727a122z
733b59;1737b123{
743c60<1747c124|
753d61=1757d125}
763e62>1767e126~
773f63?1777f127del

转载于:https://www.cnblogs.com/luoxu34/p/5239675.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值