打印带颜色的字符
文章目錄
- 先體驗一下
- 原理簡述
- ANSI 轉義序列
- 控制文本顏色
- 實驗一:用 shell 腳本控制顏色
- 實驗二:用 C 語言控制顏色
- 參考資料
先體驗一下
在終端輸入下面的代碼,并回車。
echo -e "\033[1;31m Hello World! \e[0m"效果是這樣的:
再來一個:
echo -e "\033[4;47;31m帶下劃線的白色背景的紅字 \033[0;1;41;32m高亮的紅色背景的綠字\033[0m"效果是這樣的:
原理簡述
ANSI 轉義序列
ANSI 轉義序列(ANSI escape sequences)是一種轉義序列標準。它可以用來控制終端上的光標位置、顏色等其他選項(比如清屏、滾動)。終端會把這些字節序列解釋為相應的指令,而不是普通的字符編碼。
ANSI 轉義序列大部分以 ESC 和 “[” 字符開始。
看看前面的序列,你會發現都是以 \033[ 開始。\033 也可以換成 \x1b 或者 \e ,它們的意思一樣,都表示鍵盤左上角 Esc 鍵的 ASCII 碼。
控制文本顏色
通用的控制文本顏色的轉義序列格式如下:
\033[n1;n2;n3...m- \033[ 表示轉移序列的開始;
- n1, n2, n3, … 是參數,可以有多個,也可以只有一個。后文會具體介紹。
- m 表示設置顯示屬性結束
常用的參數列表如下:
| 0 | 關閉所有格式,還原為初始狀態 |
| 1 | 粗體/高亮顯示 |
| 2 | 模糊(※) |
| 3 | 斜體(※) |
| 4 | 下劃線(單線) |
| 5 | 閃爍(慢)(※) |
| 6 | 閃爍(快)(※) |
| 7 | 交換背景色與前景色 |
| 8 | 隱藏(※) |
| 30-37 | 前景色,即30+x,x表示不同的顏色(參見下面的“顏色表”) |
| 40-47 | 背景色,即40+x,x表示不同的顏色(參見下面的“顏色表”) |
注:含有(※)標注的編碼表示不是所有的終端都支持。
顏色表:
| 顏色 | 黑 | 紅 | 綠 | 黃 | 藍 | 紫 | 青 | 白 |
如果你覺得上面 7 種顏色不夠用,可以用 24 位顏色( R、G、B 各 8 bit)
轉義序列格式是:
ESC[ … 38;2;<r>;<g>;<b> … m 設置前景色ESC[ … 48;2;<r>;<g>;<b> … m 設置背景色比如:
echo -e "\033[48;2;255;97;0m hello \033[0m"效果是:
實驗一:用 shell 腳本控制顏色
PS3="請選擇顏色: "color[1]=`echo -e "\x1b[31m紅色\x1b[0m"` color[2]=`echo -e "\x1b[32m綠色\x1b[0m"` color[3]=`echo -e "\x1b[33m黃色\x1b[0m"` color[4]=`echo -e "\x1b[34m藍色\x1b[0m"` color[5]=`echo -e "\x1b[35m紫色\x1b[0m"` color[6]=`echo -e "\x1b[36m青色\x1b[0m"` color[7]=`echo -e "\x1b[37m白色\x1b[0m"` color[0]='EXIT'select i in ${color[@]} doif [ "$i" == "${color[0]}" ];thenexit 0elseecho "$i"fi done exit 0效果展示:
實驗二:用 C 語言控制顏色
#include <stdio.h> #include <stdlib.h>#define BLA "\033[30m" //黑色 #define RED "\033[31m" //紅色 #define GRE "\033[32m" //綠色 #define YEL "\033[33m" //黃色 #define BLU "\033[34m" //藍色 #define PUR "\033[35m" //紫色 #define CYA "\033[36m" //青色 #define WHI "\033[37m" //白色#define BACK_BLA "\033[40m" //黑色 #define BACK_RED "\033[41m" //紅色 #define BACK_GRE "\033[42m" //綠色 #define BACK_YEL "\033[43m" //黃色 #define BACK_BLU "\033[44m" //藍色 #define BACK_PUR "\033[45m" //紫色 #define BACK_CYA "\033[46m" //青色 #define BACK_WHI "\033[47m" //白色// 高亮 #define HI_BLA "\033[1;30m" //黑色 #define HI_RED "\033[1;31m" //紅色 #define HI_GRE "\033[1;32m" //綠色 #define HI_YEL "\033[1;33m" //黃色 #define HI_BLU "\033[1;34m" //藍色 #define HI_PUR "\033[1;35m" //紫色 #define HI_CYA "\033[1;36m" //青色 #define HI_WHI "\033[1;37m" //白色char *font_color[] = { BLA, RED, GRE, YEL, BLU, PUR, CYA, WHI, };char *hi_font_color[] = { HI_BLA, HI_RED, HI_GRE, HI_YEL, HI_BLU, HI_PUR, HI_CYA, HI_WHI, };char *back_color[] = {BACK_BLA,BACK_RED,BACK_GRE,BACK_YEL,BACK_BLU,BACK_PUR,BACK_CYA,BACK_WHI,};// 漸變色的色表 int R[] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 240, 220, 200, 180, 160, 140, 120, 100, 80, 60, 40, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240 };int G[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 };int B[] = { 0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,240, 220, 200, 180, 160, 140, 120, 100, 80, 60, 40, 20, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };void gradual_change(void) {int i = 0;char str_r[5];char str_g[5];char str_b[5];for(; i < sizeof R / sizeof R[0]; ++i){ sprintf(str_r, "%d", R[i]);sprintf(str_g, "%d", G[i]);sprintf(str_b, "%d", B[i]);printf("\x1b[48;2;%s;%s;%sm%s\x1b[0m\n", str_r, str_g, str_b, "hello");}}int main(void) {for(int i=0; i<8; ++i){for(int j=0; j<8; ++j){printf("%s" "%s" "HELLO WORLD\033[0m",font_color[i], back_color[j]);}printf("\n");}for(int i=0; i<8; ++i){for(int j=0; j<8; ++j){printf("%s" "%s" "HELLO WORLD\033[0m",hi_font_color[i], back_color[j]);}printf("\n");}gradual_change();}效果展示:
參考資料
【1】http://man.he.net/man4/console_codes
【2】https://www.cnblogs.com/hookjc/p/13178918.html
【3】花里胡哨,如何在Linux終端輸出帶有顏色的字體,將帶顏色的字體賦值給變量
【4】漸變色表RGB值
總結
- 上一篇: mysql3.2.2 .tar.gz_关
- 下一篇: 农夫过河+java,农夫过河问题(jav