跳转到内容

终端颜色控制

ANSI 转义序列(ANSI Escape Codes)是一种在终端文本界面中嵌入特殊控制指令的方法。它本质上是一串普通文本(ASCII 字符),但符合特定格式时,终端会把它解释成“命令”而不是普通文字,可以用来:

  • 改变文字颜色/背景颜色
  • 设置加粗、下划线、闪烁等样式
  • 移动光标位置
  • 清除屏幕或部分内容
  • 隐藏/显示光标

颜色控制通过 CSI(Control Sequence Introducer)序列实现,基本格式为:

\033[<参数1>;<参数2>;...;<参数N><指令字母>

或:

\e[<参数1>;<参数2>;...;<参数N><指令字母>
  • \033 或 \e 表示 ESC 字符
  • [ 表示 CSI 的开始
  • 参数是一组十进制数字,用分号 ; 分隔
  • 指令字母表示具体的操作(m = 设置文本属性,H = 设置光标位置,J = 清除屏幕,K = 清除行等)

颜色控制是 ANSI 转义序列中最常用的功能之一,指令字母固定为 m:

\033[<参数1>;<参数2>;...;<参数N>m

使用 \033[0m 重置所有样式,否则颜色会影响后续输出。

代码 功能
0 重置所有属性
1 加粗
3 斜体
4 下划线
5 闪烁
7 反色(前景背景互换)
9 删除线

示例:

Terminal window
echo -e "\033[1;4;31m加粗+下划线+红色\033[0m"

ANSI 最初定义了 8 种基本颜色,每种颜色有前景色和背景色:

颜色 前景色代码 背景色代码
黑色 30 40
红色 31 41
绿色 32 42
黄色 33 43
蓝色 34 44
品红色 35 45
青色 36 46
白色 37 47

示例:

Terminal window
echo -e "\033[31m红色文字\033[0m"
echo -e "\033[1;33;44m加粗黄字蓝底\033[0m"

以 C 语言为例,可以将 ANSI 颜色定义成宏,方便在输出中调用:

#include <stdio.h>
/* ========== 基本样式控制宏 ========== */
#define RESET "\033[0m"
#define BOLD "\033[1m"
#define UNDERLINE "\033[4m"
/* ========== 8 色前景色 ========== */
#define FG_BLACK "\033[30m"
#define FG_RED "\033[31m"
#define FG_GREEN "\033[32m"
#define FG_YELLOW "\033[33m"
#define FG_BLUE "\033[34m"
#define FG_MAGENTA "\033[35m"
#define FG_CYAN "\033[36m"
#define FG_WHITE "\033[37m"
/* ========== 8 色背景色 ========== */
#define BG_BLACK "\033[40m"
#define BG_RED "\033[41m"
#define BG_GREEN "\033[42m"
#define BG_YELLOW "\033[43m"
#define BG_BLUE "\033[44m"
#define BG_MAGENTA "\033[45m"
#define BG_CYAN "\033[46m"
#define BG_WHITE "\033[47m"
int main() {
printf(FG_RED "红色文字" RESET "\n");
printf(BG_BLUE FG_YELLOW "蓝底黄字" RESET "\n");
printf(BOLD FG_GREEN "加粗绿色" RESET "\n");
return 0;
}

Shell 脚本示例:

#!/bin/bash
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
BOLD='\033[1m'
RESET='\033[0m'
echo -e "${GREEN}[OK]${RESET} 操作成功"
echo -e "${RED}[ERROR]${RESET} 操作失败"
echo -e "${BOLD}${YELLOW}[WARN]${RESET} 请注意"