核心語法
printf("\033[<背景色>;<前景色>m字串\033[0m")
\033[ 或 \e[:CSI (Control Sequence Introducer) 起始。
m:SGR (Select Graphic Rendition) 結束標記。
\033[0m:重置所有屬性 (關鍵,否則後續輸出受影響)。
顏色代碼對照表
| 代碼 | 顏色 | 類別 |
| 30 / 40 | 黑 | 前景 / 背景 |
| 31 / 41 | 紅 | 前景 / 背景 |
| 32 / 42 | 綠 | 前景 / 背景 |
| 33 / 43 | 黃 | 前景 / 背景 |
| 34 / 44 | 藍 | 前景 / 背景 |
| 35 / 45 | 洋紅/紫 | 前景 / 背景 |
| 36 / 46 | 青/青綠 | 前景 / 背景 |
| 37 / 47 | 白 | 前景 / 背景 |
| 90-97 / 100-107 | 高亮版 (Bright) | 前景 / 背景 |
屬性代碼
| 代碼 | 效果 | 重置代碼 |
| 0 | 重置所有 | - |
| 1 | 粗體/高亮 | 22 |
| 2 | 暗淡 | 22 |
| 3 | 斜體 | 23 |
| 4 | 底線 | 24 |
| 5 | 閃爍 | 25 |
| 7 | 反轉 (前景↔背景) | 27 |
| 8 | 隱藏 | 28 |
| 9 | 刪除線 | 29 |
實戰範例
基本彩色輸出
printf("\033[41;32m背景紅 字綠\033[0m\n")
printf("\033[1;31m粗體紅字\033[0m \033[4;34m底線藍字\033[0m\n"
printf("\033[7m反轉顯示\033[0m\n")
Bash 腳本中封裝函數
color_echo() {
local color=$1; shift
printf "\033[${color}m%s\033[0m\n" "$*"
}
color_echo "1;32" "綠色粗體成功訊息"
color_echo "31" "紅色錯誤訊息"
color_echo "44;37" "藍底白字標題"
光標與畫面控制 (進階動態效果)
| 序列 | 功能 |
\033[A | 光標上移 n 行 |
\033[B | 光標下移 n 行 |
\033[C | 光標右移 n 行 |
\033[D | 光標左移 n 行 |
\033[;H | 移動光標到第 y 行第 x 列 |
\033[2J | 清空整個螢幕 |
\033[K | 清除從光標到行尾 |
\033[s | 儲存光標位置 |
\033[u | 恢復光標位置 |
\033[?25l | 隱藏光標 |
\033[?25h | 顯示光標 |
動態進度條範例
#!/bin/bash
printf "\033[?25l" # 隱藏光標
for i in {1..100}; do
printf "\033[s" # 儲存位置
printf "\033[1;1H" # 移到第1行第1列
printf "\033[K" # 清除行
printf "Progress: %3d%% [", $i
printf "%*s" $((i/2)) | tr ' ' '='
printf "%*s" $((50-i/2)) | tr ' ' ' '
printf "]"
printf "\033[u" # 恢復位置
sleep 0.05
done
printf "\033[?25h\n" # 顯示光標換行
C 語言中使用
#include
#define RED "\033[31m"
#define GREEN "\033[32m"
#define YELLOW "\033[33m"
#define RESET "\033[0m"
int main() {
printf(RED "Error: " RESET "Something went wrong\n");
printf(GREEN "OK: " RESET "Operation successful\n");
printf(YELLOW "Warn: " RESET "Check parameters\n");
return 0;
}
注意事項與最佳實踐
- 終端支援:現代終端 (gnome-terminal, konsole, xterm, Windows Terminal, VS Code 終端) 均完整支援;舊版 Windows cmd 需啟用 VT100 (Win10 1511+)。
- 輸出重導向:輸出導向檔案/管道時,ANSI 碼會被寫入檔案,建議檢測
isatty(fileno(stdout)) 僅在終端啟用顏色。
- 庫封裝:C 專案建議使用
ncurses、termbox、ftxui 等 TUI 庫,而非手寫轉義序列。
- 色盲友善:避免紅綠單一編碼關鍵狀態,搭配符號/文字/粗體。
快速查閱卡片
# 前景色
for c in {30..37}; do printf "\033[${c}mColor ${c}\033[0m "; done; echo
# 背景色
for c in {40..47}; do printf "\033[${c}mColor ${c}\033[0m "; done; echo
# 組合
for fg in {30..37}; do for bg in {40..47}; do printf "\033[${bg};${fg}m F${fg} B${bg} \033[0m"; done; echo; done
結語
ANSI 轉義序列是終端彩色輸出的通用標準。掌握 \033[CODEm 語法、常用顏色/屬性代碼、光標控制序列,並封裝為腳本函數或 C 巨集,能讓命令列工具、日誌系統、TUI 介面擁有專業級的視覺回饋。