终端彩色文字

彩色输出的格式为: \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色处理, 被\[\]包裹.

猜你喜欢

转载自www.cnblogs.com/reaperspring/p/9559727.html