Shell 腳本中的顏色與格式化輸出 文章首圖

Shell 腳本中的顏色與格式化輸出

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 任務)中執行時。許多程式(如 lsgrep)會偵測輸出是否為終端機(TTY)。如果輸出被重導向到檔案,它們會自動禁用顏色以節省空間或避免雜訊。

解決方案: 在腳本中強制啟用顏色,可以使用 --color=always 參數(適用於支援該參數的命令),或者在腳本開頭設定環境變數 export LS_COLORS 或使用 tput 命令來動態獲取終端支援的顏色。對於自訂腳本,確保使用 echo -eprintf 來解析轉義序列。

2. 如何讓顏色在 Windows PowerShell 或 Git Bash 中也能正常顯示?

Windows 環境的終端機對 ANSI 顏色的支援較晚才完善。雖然 Windows 10 的 PowerShell 5.1+ 和 Windows Terminal 已支援 ANSI,但舊版 CMD 或某些編輯器可能無法正確渲染。

解決方案: 為了確保跨平台相容性,建議使用 tput 命令來獲取顏色代碼,而非硬編碼 \033tput 會根據 $TERM 環境變數自動選擇正確的序列。例如,設定紅色變數可寫為 RED=$(tput setaf 1)。此外,若需支援 Windows,可考慮使用 colorterm 等第三方庫,或依賴 printf\e 語法,因為其在現代環境中的相容性已大幅提升。

小結

在 Shell 腳本中運用顏色與格式化輸出,不僅是視覺上的美化,更是提升操作效率與除錯能力的實用技巧。透過定義清晰的顏色規範與封裝輸出函式,我們能建立出更具可讀性與專業感的自動化腳本。建議在開發初期就將顏色設定模組化,並注意重導向時的相容性問題,讓您的 Linux 工作流更加順暢。