Bash 腳本和實用程式:Linux 自動化完整指南

最後更新: 30月2026
  • 學習 Bash 腳本的結構、語法和關鍵命令,以建立強大且可移植的腳本。
  • 掌握變數、陣列、條件語句、迴圈語句、函數、I/O 和 cron,實現現實世界任務的自動化。
  • 應用良好的調試實踐,並使用內部變數和外部工具,例如 ShellCheck。
  • 整合 Bash 框架和實用程式集合,為您的腳本添加 GUI、並發性和進階功能。

bash腳本工具

如果你每天都使用 Linux 系統——無論是管理伺服器、擺弄容器還是開發應用程式——掌握Bash 腳本編寫可能是最能節省你時間的技能。只需幾個文字檔案和一點想像力,你就可以自動化從備份到複雜部署的一切操作,以及那些你目前甚至都沒意識到自己還在手動執行的日常任務。

在本指南中,我們將深入探討如何使用Bash 腳本和實用程式集合,將您的腳本從簡單的基礎命令升級為真正專業的工具。我們將從 shell 基礎知識入手,涵蓋基本命令、控制結構、函數、陣列、調試、cron 等內容。此外,我們還將探索一些函數庫和Bash 圖形使用者介面,幫助您將腳本功能提升到一個新的水平。

Bash是什麼?為什麼它在自動化方面如此有用?

什麼是bash腳本?

Bash(Bourne Again Shell)是類Unix系統上最廣泛使用的命令解釋器:絕大多數Linux發行版都將其作為預設shell,在macOS和Windows上也可以透過WSL或Git Bash類型的終端找到它。它既是一個互動式介面,也是一種腳本語言。

打開終端機後,Bash 會顯示一個提示符,您可以在其中輸入命令。每個命令通常遵循“命令 參數”的結構。您在終端機中「手動」執行的所有操作都可以寫入一個文字文件,然後批次執行。

Bash腳本其實就是一個純文字文件,其中包含一系列指令,shell 會依序執行這些指令。這就是它的神奇之處:你無需每天輸入 10 個命令,只需將它們保存下來,賦予它們執行權限,然後一步運行即可。此外,你還可以加入變數、條件語句、迴圈語句和函數,以便進行決策、重複執行任務以及封裝邏輯。

Bash 也遵循經典的 Unix 理念:使用許多功能單一但性能卓越的小工具,並透過管道將它們組合起來。只需一個腳本,您就可以將find、grep、sed、awk、tar、gzip、ssh、scp以及任何其他系統實用程式串聯起來,從而創建功能強大的管理和維護流程。

shell 和 Bash 腳本的基本概念

Bash腳本基礎知識

要充分理解 Bash 腳本,必須區分兩個概念:shell和腳本本身。 shell 是解釋指令的程序,而腳本則是將這些指令組合成可執行檔的過程。

典型的腳本總是以一個名為shebang 的特殊行開頭。這行程式碼告訴系統使用哪個解釋器來執行該檔案。你通常會看到類似這樣的內容:

#!/bin/bash

您也可以使用`#!/usr/bin/env bash`讓系統在 PATH 環境變數中尋找 Bash。如果可執行檔的路徑並非 `/bin/bash`(這種情況有時會在一些特殊環境中發生),這種方法可以提供更大的彈性。

腳本通常以.sh副檔名儲存(為了清晰起見,並非強制要求),您必須使用`chmod +x script_name.sh` 指令賦予它們執行權限。之後,您可以使用`./ script_name.sh` 命令運行它們,或直接呼叫 bash 來運行。

bash nombre_script.sh
./nombre_script.sh

理解stdin、stdout 和 stderr的概念也很重要:它們分別是標準輸入(鍵盤或其他重定向的目標)、標準輸出(螢幕)和錯誤輸出。掌握如何重新導向和合併這些資料流是編寫簡潔易偵錯腳本的關鍵。

在日常生活中使用 Bash 腳本的真正優勢

Bash腳本的優勢

使用 Bash 進行自動化並非老派管理員的怪癖;它具有非常明顯的優勢。只需一個文件,您就可以打包一長串命令,並根據需要多次運行,而且每次運行都一致且無錯誤。

第一個主要優勢是自動化。無需每次部署應用或建立備份時手動重複步驟,只需將所有操作編寫成腳本,並在需要時執行(或使用 cron 定時任務執行)。減少人工操作,降低低階錯誤。

另一個重要的優點是可移植性。只要你使用的指令可用,你的腳本就能在任何 Linux 發行版、macOS 甚至安裝了 Bash 環境的 Windows 系統上運作。這使得許多任務可以輕鬆地在不同環境之間遷移。

這些腳本非常透明:它們只是純文字。任何人都可以打開它們,查看其功能並進行修改。無需編譯或解密二進位。如果將它們與 Git 結合使用,即可獲得免費的版本控制和變更稽核功能。

  Linux 命令精通入門指南

最後,學習 Bash 相當容易。如果你知道如何操作終端,並且對程式設計有基本的了解(變數、if 語句、循環),你就能很快上手。而且,從生產力的角度來看,這方面的投入回報是巨大的。

Bash腳本的創建和基本結構

創建你的第一個腳本幾乎是輕而易舉的,但最好從一開始就做好。一個最基本的 Bash 腳本框架應該包含 shebang 行、註解、腳本主體和受控退出語句。

通常的開頭是:

#!/bin/bash
# Descripción: pequeño script de ejemplo
echo "Hola, mundo"

雖然這看似微不足道,但在腳本開頭記錄腳本的功能、所需的參數以及一個簡單的使用範例總是有益的。這些資訊可以用註解添加,在 Bash 中,註解以#開頭,會被解釋器完全忽略。

在頭部之後,你可以寫邏輯:變數定義、輸入讀取、命令呼叫、函數、迴圈、條件語句……所有你需要用來自動化目前任務的內容。

另一個重要的細節是,腳本必須傳回一個一致的退出程式碼,例如`exit N`。代碼 0 表示成功,任何其他值都表示錯誤。可以使用`$?`從外部檢查此值,從而允許您連結腳本並對失敗做出回應。

Bash 中的註解、變數和資料類型

註解是你的好幫手:它們可以用來解釋腳本某一部分的功能、某個決策背後的原因,或者解釋那個奇怪的循環在六個月後你完全忘記它時究竟會做什麼。和許多其他語言一樣,Bash 中的註解以#開頭,到行尾結束。

關於變量,Bash 非常靈活:沒有正式的類型定義,所有值都是字串,shell 會根據你的請求決定是否將其解釋為數字。要賦值,只需使用`name=value`,等號前後不要有空格。

pais="España"
numero=42

若要讀取變數的內容,請在變數名稱前加上$符號,例如$country。如果需要更清晰的表達或連接複雜的文本,最好使用${country}來正確地分隔它們。

注意引號的使用。使用雙引號時,Bash 會解釋變數和一些特殊序列(例如“$var”和“\n”)。而使用單引號時,所有內容都被視為字面文字:'$var'會原樣列印,不會進行任何擴展。

還有一些用於處理參數和上下文的特殊變數: $#(參數數量)、$0(腳本名稱)、$1、$2…(位置參數)、$?(最後一個命令的退出代碼)、$$(進程 PID)等等,這些變數的定位都很有用。

Bash腳本中的輸入與輸出

一個有用的腳本很少孤立存在:它通常會向使用者請求資料、讀取檔案、處理日誌或將結果寫入磁碟。為此,你需要熟練`read`、`echo` 和重定向。

讀取使用者輸入內容最簡單的方法是使用read 函數:

echo "Introduce tu nombre:"
read nombre
echo "Hola, $nombre"

要將文字輸出到標準輸出,我們使用`echo`或`printf` 函數。 `echo` 寫起來更簡單快捷,而 `printf` 則提供了對格式的完全控制(對齊方式、小數位數等)。您也可以使用`>`(覆蓋)或`>>`(追加)將任何輸出重新導向到檔案。

例如,要將“Hello world”儲存到檔案中:

echo "Hola mundo" > hola.txt

或者,若要在不刪除原有行的情況下新增行:

echo "Otra línea" >> hola.txt

如果要將正常輸出與錯誤輸出分開,請記住stdout 是描述符 1,stderr 是描述符 2。您可以將它們傳送到不同的文件,或者如果您不需要它們,甚至可以將它們丟棄到/dev/null 。

comando 1>salida.txt 2>errores.txt
comando >/dev/null 2>&1

編寫腳本所需的基本 Bash 指令

每個 Bash 腳本都依賴一組基本的系統命令。你可能每天都會使用其中的許多命令,但在腳本中使用它們時,理解它們的語法至關重要:一個錯誤的空格或一個不尋常的路徑都可能導致整個進程崩潰。

您可以使用`pwd`(顯示目前目錄)和`cd` (切換資料夾)來瀏覽系統。要列出內容,請使用 `ls`及其眾多選項。使用`mkdir`建立目錄,使用`rm`刪除檔案(務必謹慎),以及使用`mv`和`cp`移動/複製檔案。

典型的文字檢查指令包括`cat`(顯示檔案)、`tac`(反轉)、`head`、`tail`以及諸如`grep`、`sed`和`awk`之類的過濾工具。這些命令構成了建立腳本的基礎,這些腳本可以分析日誌、執行批次替換或提取特定資料。

在系統層面,值得了解的命令包括:​​ `ps`和`top`(用於管理進程)、`kill`(用於終止進程)、`df`和`du`(用於查看磁碟空間)以及`systemctl`(用於管理使用 systemd 的系統上的服務)。所有這些命令都自然地整合到了腳本中。

  逆波蘭表示法完全指南

最後,別忘了使用`man`指令:也就是手冊。幾乎所有關於命令選項和行為的問題都可以透過`man command` 命令找到答案。能夠流利地閱讀手冊頁是成為管理員的一半成功秘訣。

控制結構:條件和循環

隨著腳本規模的擴大,你需要讓它們做出決策並重複執行某些操作。這時就需要用到控制結構:if/else、case、while、until 和 for。

Bash 中經典的條件語句使用`if`和`[ ] ` 來判斷條件。例如,要檢查一個數字是否大於 10:

read num
if ]; then
  echo "El número es mayor a 10"
else
  echo "El número es menor o igual a 10"
fi

語法 ` ] ` 比 `case` 更現代、更安全,並且允許使用更方便的邏輯運算子和改進的字串處理。對於一些預先定義的情況,`case`非常易讀,尤其是在有多個預期值時:

read n
case $n in
  101)  echo "Primer número" ;;
  510)  echo "Segundo número" ;;
  999)  echo "Tercer número" ;;
  *)    echo "Sin coincidencias" ;;
esac

在循環部分,`while` 循環會在滿足條件時重複執行,`until`循環則相反(直到條件為真為止),而`for` 循環用於遍歷列表、數組或數值範圍。例如,可以使用 `for` 循環來遍歷一週中的每一天:

for dia in Lunes Martes Miércoles Jueves Viernes Sábado Domingo; do
  echo "Día: $dia"
done

一個典型的帶有內部計數器的 while 迴圈:

i=0
while ]; do
  echo $i
  ((i++))
done

Bash 函數:邏輯重複使用而不至於崩潰

Bash 中的函數允許你將命令分組並根據需要多次重複使用,從而使你的腳本更加簡潔易讀。如果腳本規模超過一定程度而不使用函數,最終會變成一個難以維護的龐然大物。

它們可以用兩種等效的方式來聲明:

hola() {
  echo "Hola desde una función"
}

function hola2 {
  echo "Hola también"
}

要呼叫它們,只需像呼叫其他命令一樣,將它們的名稱寫在一行即可。它們並不會因為被定義就自動執行,所以不要忘記在腳本主體中呼叫它們。

函數接收位置參數的方式與腳本完全相同:在函數內部,您可以使用$1、$2、$#等。您可以使用return N傳回數值程式碼(用於指示成功或錯誤),並使用全域變數傳回更豐富的結果,例如字串或陣列。

此外,你可以在函數內部將變數標記為局部變量,這樣它們就不會「污染」腳本的其他部分。強烈建議這樣做,以避免意外覆蓋全局值。

Bash 中的陣列和文字處理

雖然 Bash 並非為複雜的計算而設計,但它對數組和字串操作的處理能力足以應對許多自動化任務。掌握這些功能的使用方法,只需幾個指令就能大大擴展你的工作能力。

一個簡單的陣列定義如下:

frutas=(Pera Manzana Plátano)

您可以使用`${fruits}`存取單一元素,使用`${fruits}`取得所有元素,使用`${#fruits}`取得元素數量,並使用`${!fruits}`取得索引。當數組中存在“空位”且您只想遍歷有效位置時,後者非常有用。

要遍歷整個系統,可以使用 for 迴圈遍歷索引:

for i in ${!frutas}; do
  echo "frutas = ${frutas}"
done

Bash 支援對文字字串進行多種內建操作:長度(${#str})、子字串(${str:N:M})、替換(${str/ant/new}、${str//ant/new})、前綴和後綴修剪(${str#text}、${str%text})等。這些工具使得在執行簡單任務時無需使用 sed 或 awk。

對於更複雜的文字處理(例如大型日誌或表格資料),您需要grep、sed、awk、cut等工具,您可以將它們透過管道連結在一起,或直接整合到 Bash 函數中。

權限、執行和 cron:從獨立腳本到計劃任務

腳本編寫完成後,需要使其可執行,並決定如何啟動它。通常的步驟是:

chmod +x mi_script.sh

如果目前目錄下,可以直接執行`./my_script.sh`;如果位於同一目錄下,則可以使用其絕對路徑`/full/path /my_script.sh`。另一種方法是透過`bash my_script.sh`呼叫它,但無需賦予其執行權限,不過這在生產環境中並不常見。

當您希望腳本定期運行(例如每天、每週、每 5 分鐘等)時, cron就派上用場了。使用`crontab -e` 命令,您可以編輯使用者的任務表並定義以下內容:

0 0 * * *   /ruta/backup.sh
*/5 * * * * /ruta/monitor.sh

第一行腳本每天午夜執行一次;第二行腳本每 5 分鐘執行一次。欄位依序表示分鐘、小時、日期、月份和星期幾。您可以使用`crontab -l`查看已排程的排程任務。

  正規表示式 (RegEx):完整指南和範例

如果出現問題,最好的方法是檢查系統日誌。在 Debian/Ubuntu 系統中,cron 任務資訊通常會記錄在`/var/log/syslog` 檔案中。查看這些日誌可以了解任務是否運行、是否因權限問題而崩潰,或者是否根本沒有啟動。

Bash 中的調試、最佳實踐和特殊變量

偵錯 Bash 腳本有一些技巧,因為預設情況下,即使命令執行失敗,shell 也會繼續執行。為了解決這個問題,最好啟用嚴格模式並使用 Bash 提供的偵錯選項。

在腳本開頭添加類似這樣的內容:

set -euo pipefail
set -x

這使得腳本在遇到第一個錯誤時停止(-e),將未定義的變數視為失敗(-u),檢測管道中的錯誤(pipefail),並在執行每個命令之前顯示其展開狀態(-x)。在開發過程中,這非常有用;在生產環境中,您可能更傾向於僅在特定部分啟用-x 。

除了BASH_REMATCH(在正規表示式中非常有用)之外,Bash 還有一些內部變量,例如BASH_SUBSHELL(當前子 shell 層級)、BASH_ENV(啟動子 shell 時載入的檔案)、BASH_EXECUTION_STRING(正在執行的命令)和BASH_VERSION(解釋器版本)。這些變數都能幫助您根據環境調整腳本的行為、偵錯異常問題並確保相容性。

此外,也建議使用描述性變數名,避免使用保留字,記錄函數,始終驗證使用者輸入,並檢查關鍵命令(備份、刪除、批次移動)的退出代碼。

別忘了還有像ShellCheck這樣的外部工具,它可以分析你的腳本,並提醒你注意那些不易察覺的錯誤、不良實踐和危險的結構。將其整合到你的編輯器或 CI/CD 管線中,是提升程式碼品質的簡單方法。

適用於腳本的 Bash 實用程式和圖形使用者介面集合

除了 Bash 的內建功能外,GitHub 上還託管著許多強大的框架和函數集,您可以使用`source` 命令將它們「插入」到自己的腳本中。這樣,您就可以在幾秒鐘內整合一些實用工具,而這些工具如果由 Bash 開發,則需要花費大量時間。

Bashmatic就是一個例子,它是一個擁有數百種功能的框架,可以簡化從格式化輸出和日誌到並發任務執行、設定管理以及與外部服務互動等各種操作。它尤其註重在腳本運行時向開發者提供清晰的回饋,這在處理需要幾分鐘甚至幾小時才能完成的流程時尤其重要。

為了並行運行任務,像bash-concurrent 這樣的專案提供了一個現成的函數,可以同時啟動多個作業,並在作業完成後依序顯示輸出。這對於需要處理許多獨立元素(多個伺服器、檔案等)的腳本來說非常理想。

如果您需要在 Bash 之上建立輕量級圖形介面,可以使用EasyBashGUI或Script-Dialog等項目,它們會根據您已安裝的元件(例如kdialog、zenity、whiptail、dialog等)產生 GUI 或 TUI 對話方塊。這樣,無論您是在圖形環境中執行腳本,還是在純終端機中執行腳本,同一個腳本都能正常運作。

這些函式庫的使用方法基本上相同:下載或複製程式碼庫,然後在腳本中新增類似 ` source /path/to/utilities.sh` 的一行程式碼。之後,該檔案中定義的所有函數都可以在你的腳本中使用,就像它們是你自己寫的一樣。

最終,掌握 Bash 腳本編寫並了解一些第三方實用程序,就能為你提供一套強大的工具箱,用於自動化 Linux(以及類似環境),而無需浪費時間重複造輪子。從小型個人腳本到關鍵的系統管理流程,Bash 憑藉其常用的命令、清晰的控制結構、良好的調試實踐和外部庫,成為任何嚴肅的技術工作流程中不可或缺的組成部分。

Linux 自動化
相關文章:
Linux 自動化:從 cron 和 Bash 到 Ansible 和 systemd