终端彩色文字
彩色输出的格式为: \e[颜色代码m文本\e[m
\e[*m和\em分别为开始与结束标记, 注意, 如果缺少结束标记, 后续输出也会被着色.
颜色代码有几种格式, 网上最常见的是8色, 其中:
30–37代表前景色, 分别为黑,红,绿,黄,蓝,品红,青,白.
40–47颜色一样,只是代表背景色.
90-97代表相应的前景亮色.
100-107代表背景亮色.
除了以上颜色代码,还有一些属性代码,
常见的有1,3,4,5,9分别为粗体,斜体,下划线,闪烁,划线(就是你写错字了,直接在错字上划一道)
以上代码由分号;分隔组合, 例如
\e[31mHAHAHA\e[m 红字HAHAHA
\e[1;32mHAHAHA\e[m 粗体绿色
\e[34;4mHAHAHA\e[m 下划线蓝色
\e[1;31;42mHAHAHA\e[m 绿底粗体红字
实际上8色里的颜色名只是代称, 和终端设置有关, 比如将gnome-terminal调色板里的
红色改成白色, 那么31实际显示的就是白色.
如果终端支持256色(大多数情况都支持吧...), 颜色格式必须指定前缀,
38;5和48;5分别代表前景背景, 例如:
\e[38;5;1mHAHAHA\e[m 红色
\e[1;38;5;1mHAHAHA\e[m 粗体红色
\e[1;38;5;1;48;5;2mHAHAHA\e[m 背景绿色粗体红字
256色对应代码如下:
如果终端支持真彩色, 那么前缀变为38;2与48;2, 这个具体就不介绍了, 256够用了.
另外如果彩色字符串是给PS1之类的提示符使用的, 则其起始标记必须被\[和\]包裹,
PS1="\[\e[31m\]HAHAHA\[\e[m\]"
因为可读性实在太烂, 极易出错, 最好写个函数规整一下, 网上没找到现成的工具, 发个自己写的吧:
_gce () { #{{{ local co_code="$1" str="$2" is_ps="$3"; co_code=$(echo "$co_code" | tr -d '[:space:]'); co_code=${co_code/A/;}; if [[ ${co_code: -2} == ':V' ]]; then co_code=${co_code:0: -2}; co_code=${co_code/F/;38;5;}; co_code=${co_code/B/;48;5;}; else co_code=${co_code//[FB]/;}; fi co_code="${co_code:1}m"; local co_str; if [[ $is_ps == 'ps' ]]; then co_str="\[\e[$co_code\]$str\[\e[m\]"; else co_str="\e[$co_code$str\e[m"; fi echo -n "$co_str"; } #}}}
参数分别为: 颜色代码 字符串 是否为ps所用,
颜色代码格式为 [An] [Bn] [Cn] [:V]
A后接属性代表, 如粗体下划线等,以分号;分隔
F为前景色
B为背景色
默认以8色处理, :V只能出现在末尾,代表256色.
_gce "A1 F31 B42" 'str' 绿色背景粗体红字
_gce "A1;3 F2 :V" 'str' 粗斜体绿字, 256色处理
_gce " F4 :V" 'str' ps 普通蓝字, 256色处理, 被\[\]包裹.