Shell 腳本中的顏色與格式化輸出
在日常的 Linux 系統管理與自動化腳本開發中,清晰的視覺反饋對於除錯(Debugging)和使用者體驗至關重要。當我們執行一個長達數分鐘的備份腳本或部署流程時,若終端機僅輸出單調的黑白文字,往往難以快速捕捉關鍵資訊。透過在 Shell 腳本中加入 ANSI 顏色代碼與格式化輸出,我們不僅能提升腳本的專業度,更能有效區分資訊層級,讓執行狀態一目了然。
ANSI 顏色代碼基礎
Shell 中的顏色並非由 Shell 本身直接支援,而是透過終端機(Terminal Emulator)解讀特殊的 ANSI 轉義序列(Escape Sequences)來實現。這些序列以 \e 或 \033 開頭,後接控制碼。
最常見的格式為:\033[代碼m文字\033[0m。其中,\033[0m 用於重置樣式,確保後續文字恢復預設顏色,避免顏色污染後續輸出。
以下是常用的前景(文字)與背景顏色代碼對照表:
| 顏色類型 | 代碼 | 說明 |
|---|---|---|
| 前景色 | 30 | 黑色 |
| 31 | 紅色 | |
| 32 | 綠色 | |
| 33 | 黃色 | |
| 34 | 藍色 | |
| 35 | 紫紅色 | |
| 36 | 青色 | |
| 37 | 白色 | |
| 背景色 | 40 | 黑色背景 |
| 41 | 紅色背景 | |
| 42 | 綠色背景 | |
| 43 | 黃色背景 | |
| 44 | 藍色背景 |
此外,我們還可以結合樣式代碼來增強視覺效果,例如 1 代表粗體,4 代表底線,7 代表反白。
實戰範例:打造專業級腳本輸出函式
為了讓顏色設定更易於維護與重複使用,我們通常會將其封裝為 Bash 函式。以下是一個在 Ubuntu 22.04 或 Debian 12 上可直接執行的完整範例腳本 color_output.sh。
#!/bin/bash
# 定義顏色變數
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color (重置)
# 定義輸出函式,方便重複呼叫
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# --- 腳本主體邏輯 ---
echo "開始執行系統檢查腳本..."
echo "------------------------"
# 模擬檢查過程
log_info "正在檢查網路連線..."
sleep 1
if ping -c 1 8.8.8.8 &>/dev/null; then
log_success "網路連線正常。"
else
log_error "無法連線至外部網路。"
fi
log_info "正在檢查磁碟空間..."
sleep 1
# 使用 df 命令並過濾輸出
disk_usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$disk_usage" -gt 90 ]; then
log_warning "磁碟使用率超過 90%,請注意空間管理!"
else
log_success "磁碟空間充足 (使用率: ${disk_usage}%)。"
fi
echo "------------------------"
echo "腳本執行完畢。"
將上述程式碼儲存為 color_output.sh,並賦予執行權限 chmod +x color_output.sh 後執行,您將看到帶有顏色的格式化輸出。這種方式特別適合用於 CI/CD 管道、系統監控腳本或任何需要明確狀態回報的場景。
常見問題與解決方案
在使用顏色輸出時,開發者經常會遇到一些環境相容性問題。以下是兩個最常見的痛點:
1. 為什麼在某些環境下顏色顯示為原始碼(如 [0;32m)?
這通常發生在將輸出重導向(Redirect)到檔案時,或者在非互動式 Shell(如某些 Cron 任務)中執行時。許多程式(如 ls 或 grep)會偵測輸出是否為終端機(TTY)。如果輸出被重導向到檔案,它們會自動禁用顏色以節省空間或避免雜訊。
解決方案:
在腳本中強制啟用顏色,可以使用 --color=always 參數(適用於支援該參數的命令),或者在腳本開頭設定環境變數 export LS_COLORS 或使用 tput 命令來動態獲取終端支援的顏色。對於自訂腳本,確保使用 echo -e 或 printf 來解析轉義序列。
2. 如何讓顏色在 Windows PowerShell 或 Git Bash 中也能正常顯示?
Windows 環境的終端機對 ANSI 顏色的支援較晚才完善。雖然 Windows 10 的 PowerShell 5.1+ 和 Windows Terminal 已支援 ANSI,但舊版 CMD 或某些編輯器可能無法正確渲染。
解決方案:
為了確保跨平台相容性,建議使用 tput 命令來獲取顏色代碼,而非硬編碼 \033。tput 會根據 $TERM 環境變數自動選擇正確的序列。例如,設定紅色變數可寫為 RED=$(tput setaf 1)。此外,若需支援 Windows,可考慮使用 colorterm 等第三方庫,或依賴 printf 的 \e 語法,因為其在現代環境中的相容性已大幅提升。
小結
在 Shell 腳本中運用顏色與格式化輸出,不僅是視覺上的美化,更是提升操作效率與除錯能力的實用技巧。透過定義清晰的顏色規範與封裝輸出函式,我們能建立出更具可讀性與專業感的自動化腳本。建議在開發初期就將顏色設定模組化,並注意重導向時的相容性問題,讓您的 Linux 工作流更加順暢。