Shell 腳本中的選單介面實作 文章首圖

Shell 腳本中的選單介面實作

Shell 腳本中的選單介面實作

在 Linux 系統管理或日常自動化任務中,我們經常需要執行多個命令或腳本。雖然透過參數傳遞(如 ./script.sh --option)可以達到控制目的,但對於非技術背景的使用者,或者需要快速切換不同情境的場景,文字選單(Menu Interface)能提供直觀且友好的互動體驗。

許多初學者認為製作選單必須依賴 Python 或 Bash 的 GUI 框架,其實不然。利用 Bash 內建的 read 指令搭配 case 敘述,我們就能輕鬆打造一個結構清晰、邏輯嚴密的文字選單系統。本文将介紹如何實作一個標準的互動式選單,並探討其實作細節。

實作原理與核心指令

實作文字選單主要依賴兩個核心元件:

  1. clearecho:用於清理螢幕並顯示選單選項。
  2. readcaseread 負責接收使用者輸入,case 則根據輸入值執行對應的程式碼區塊。

以下是一個完整且可直接在 Ubuntu 22.04 或 Debian 12 上執行的腳本範例。此腳本模擬了一個系統維護工具,包含查看狀態、重啟服務與退出三種功能。

#!/bin/bash

# 定義選單顯示函式
show_menu() {
    echo "================================"
    echo "       系統維護選單"
    echo "================================"
    echo " 1. 查看系統狀態"
    echo " 2. 重啟網路服務"
    echo " 3. 查看登入使用者"
    echo " 0. 離開選單"
    echo "================================"
    echo -n "請輸入選項 [0-3]: "
}

# 主程式邏輯
while true; do
    clear
    show_menu

    # 讀取使用者輸入,-n 1 表示只讀取一個字元
    read -n 1 option

    # 根據輸入執行對應動作
    case $option in
        1)
            echo ""
            echo ">>> 正在執行:查看系統狀態..."
            echo "CPU 使用率:$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')%"
            echo "記憶體使用率:$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100}')%"
            echo "按 Enter 鍵繼續..."
            read
            ;;
        2)
            echo ""
            echo ">>> 正在執行:重啟網路服務..."
            # 注意:實際環境可能需要 sudo 權限
            if systemctl restart networking 2>/dev/null; then
                echo "網路服務重啟成功!"
            else
                echo "無法重啟服務,請檢查權限或服務名稱。"
            fi
            echo "按 Enter 鍵繼續..."
            read
            ;;
        3)
            echo ""
            echo ">>> 正在執行:查看登入使用者..."
            who
            echo "按 Enter 鍵繼續..."
            read
            ;;
        0)
            echo ""
            echo "感謝使用,再見!"
            exit 0
            ;;
        *)
            echo ""
            echo ">>> 錯誤:無效的選項,請重新輸入。"
            sleep 2
            ;;
    esac
done

將上述程式碼儲存為 menu.sh,並給予執行權限 chmod +x menu.sh 後執行,即可看到互動式選單的效果。

程式碼深度解析

在這個範例中,我們使用了 while true 建立無限迴圈,確保選單在選擇退出前一直運作。clear 指令確保每次迴圈開始時,螢幕都會保持整潔,避免資訊堆疊造成視覺混亂。

特別值得注意的是 read -n 1 option 這行指令。加上 -n 1 參數後,腳本不需要等待使用者按下 Enter 鍵,只要按下任意單一字元就會立即回應。這提供了更接近圖形介面(GUI)的流暢感。若省略 -n 1,則必須按 Enter 才會觸發 case 判斷。

case 區塊中,我們使用了 $(...) 命令替換來即時獲取系統資訊。例如 free | grep Mem 能動態取得記憶體使用百分比。這種動態獲取資訊的方式,讓選單不僅僅是靜態的提示,而是具備實際功能的工具。

常見問題與解決方案

在實作選單腳本時,開發者常會遇到以下兩個問題:

  1. 輸入非預期字元導致腳本崩潰 如果使用者輸入的不是數字(例如字母或符號),case 會進入 * 的預設分支。若未處理此情況,可能會導致後續邏輯錯誤。解決方案是務必保留 * 分支作為錯誤處理,並使用 sleep 暫停片刻讓使用者看清錯誤訊息,再讓迴圈繼續。

  2. 特殊字元或長選項難以輸入 使用 -n 1 雖然反應快,但限制了選項只能為單一字元。若選項超過 10 個,數字輸入會變得不便。此時可移除 -n 1,改用標準的 read option,並建議使用者輸入完整的數字或關鍵字。此外,若需處理複雜的選擇(如目錄瀏覽),建議改用 dialogwhiptail 等外掛程式,它們能提供更好的視窗管理與箭頭鍵導航功能。

小結

透過簡單的 Bash 指令組合,我們就能實作一個功能完整且易於維護的選單介面。這種方法不僅降低了腳本的學習門檻,也讓自動化任務的執行更加直觀。對於系統管理員而言,掌握選單實作技巧,能有效提升日常操作的效率與專業度。建議讀者不妨將此範例作為起點,根據自身需求擴充更多系統監控或管理功能。