Shell 腳本的條件判斷深入解析 文章首圖

Shell 腳本的條件判斷深入解析

Shell 腳本的條件判斷深入解析

在 Linux 系統管理與自動化運作的領域中,Shell 腳本無疑是最強大的工具之一。對於許多初學者而言,理解變數賦值或基礎指令流轉並不困難,但若要撰寫出具備「決策能力」的腳本,則必須精通條件判斷(Conditional Statements)。這不僅能讓你的腳本更具彈性,也能有效避免錯誤執行帶來的風險。本文将深入解析 Bash Shell 中的條件判斷機制,並提供在 Ubuntu 22.04 與 Debian 12 環境下可直接運行的實用範例。

基礎語法與測試運算子

在 Bash 中,條件判斷主要依賴 ifelifelse 關鍵字組合。其核心在於「測試」(test)命令,通常以方括號 [ ] 或雙方括號 [[ ]] 來表示。雖然兩者功能相似,但 [[ ]] 是 Bash 的擴展語法,提供了更強大的模式匹配與安全性,因此在現代腳本撰寫中更為推薦。

測試運算子分為三大類:數值比較、字串比較與檔案測試。例如,檢查檔案是否存在通常使用 -e-f(檢查是否為普通檔案),而數值比較則使用 -eq-ne 等符號,而非我們習慣的 ==!=

實戰範例:智慧備份腳本

為了展示條件判斷的實際應用,我們撰寫一個簡單的備份檢查腳本。這個腳本會檢查目標目錄是否存在,若不存在則建立;若存在,則檢查其空間是否足夠。

#!/bin/bash

# 定義變數
BACKUP_DIR="/home/user/backups"
TARGET_FILE="/tmp/test_backup.tar.gz"
MIN_SPACE_KB=102400 # 100 MB

# 1. 檔案與目錄測試
if [[ ! -d "$BACKUP_DIR" ]]; then
    echo "目錄不存在,正在建立..."
    mkdir -p "$BACKUP_DIR"
    if [[ $? -eq 0 ]]; then
        echo "目錄建立成功。"
    else
        echo "目錄建立失敗,請檢查權限。"
        exit 1
    fi
else
    echo "目錄已存在:$BACKUP_DIR"
fi

# 2. 數值與邏輯運算
# 模擬檢查可用空間 (此處為假設性邏輯,實際可使用 df 指令)
available_space=200000

if (( available_space > MIN_SPACE_KB )); then
    echo "空間充足,可以進行備份作業。"
    # 這裡可以接上实际的 tar 指令
else
    echo "警告:磁碟空間不足!需要至少 ${MIN_SPACE_KB} KB。"
    exit 2
fi

echo "腳本執行完畢。"

在上述範例中,我們使用了 [[ ]] 來處理字串與路徑測試,並使用雙括號 (( )) 來進行純數值運算。值得注意的是,在 if 區塊內,我們使用了 $? 來獲取上一個指令的返回碼(Exit Status),這是 Shell 腳本中判斷指令是否成功執行的關鍵指標。

常見問題與陷阱

在撰寫條件判斷時,新手常會遇到以下兩個問題:

  1. 空格的重要性:在 [ ][[ ]] 中,運算子與參數之間必須有空格。例如,if [ $a=1 ] 會導致錯誤,正確寫法應為 if [ "$a" = "1" ]。雖然 [[ ]] 對空格的容忍度較高,但保持規範能提升腳本的相容性。
  2. 變數未定義時的錯誤:如果變數 $USER 未定義,直接寫 if [ $USER = "root" ] 會因為展開為 if [ = "root" ] 而報錯。因此,務必使用引號將變數包起來,即 if [ "$USER" = "root" ],這樣即使變數為空,比較操作也能安全進行。

小結

掌握 Shell 腳本的條件判斷,是邁向自動化系統管理的重要一步。透過靈活運用 if[[ ]] 以及各種測試運算子,我們可以編寫出既安全又高效的自動化腳本。建議在實際開發時,多利用 bash -n script.sh 進行語法檢查,並養成使用雙引號保護變數的良好習慣。希望這篇文章能幫助你更自信地處理 Linux 環境下的邏輯判斷任務。