Mendel Cooper:advanced Bash Scripting Guide——an In Depth Exploration Of The Art Of Shell Scripting@2014 (文档版本 10.0)

《Advanced Bash-Scripting Guide》這份文件是一份深入探討 Bash Shell Scripting 藝術的指南。其主要目的是作為教科書、自學手冊,以及 Shell Scripting 技術的參考資源和知識來源。文件假設讀者沒有程式設計或腳本編寫的先備知識,但進程快速,旨在將讀者引導至中級到高級的水平,並穿插 UNIX 系統的實用知識。

指南強調,即使不打算實際編寫腳本,具備 Shell Scripting 的工作知識對於任何希望精通系統管理的人來說都是必不可少的。了解系統啟動時 /etc/rc.d 中執行的 Shell 腳本對於分析系統行為和進行客製化修改至關重要。Shell Scripting 提供了一種「快速而粗糙」的方式來原型化複雜應用程序。在決定使用 C, C++, Java, Perl, 或 Python 等編譯型或更強大的解釋型語言進行最終開發之前,先用 Shell 腳本實現功能子集,可以有效測試應用結構並發現主要問題。這種做法體現了經典的 UNIX 哲學——將複雜項目分解為更簡單的子任務,並串聯利用現有的組件和實用程序。相較於 Perl 這類試圖「包辦一切」的強大語言,這種方法被許多人認為更為優雅。

文件的學習方法注重實踐,認為真正學會 Scripting 的唯一方法是「寫腳本」。因此,指南大量依賴範例腳本(通常附有詳細註釋)和練習,鼓勵讀者積極動手。這些範例腳本經過實際測試,部分甚至在現實中有用。文件的組織結構呈教程形式,從最基本的概念開始,逐步引入 Shell Scripting 的各種特性、操作符和技術。指南鼓勵讀者從簡單的命令列表開始,逐步改進和通用化腳本,例如用變量取代硬編碼值,或將重複代碼塊組織成函數,從而建立個人的程式碼片段庫。

然而,指南也明確指出了不適合使用 Shell Scripting 的場景,這構成了關於其適用範圍和局限性的重要論點:

  1. 資源密集型任務: 對於速度要求高的任務,特別是排序、雜湊、遞歸等,Shell 腳本效率較低。
  2. 重度數學運算: 對於需要浮點數、任意精度計算或複數等高級數學功能的應用,建議使用 C++ 或 FORTRAN。
  3. 跨平台需求: 如果應用需要高度的跨平台兼容性,C 或 Java 是更佳選擇。
  4. 複雜應用程序: 需要嚴格的結構化編程實踐(如變量類型檢查、函數原型)時,Shell Scripting 功能不足。
  5. 任務關鍵型應用: 涉及系統穩定性和業務運營的核心應用,不應依賴 Shell 腳本。
  6. 安全性: 在對系統完整性要求極高、需要防範入侵和破壞的場景下,Shell 腳本安全性不足,因為源碼是公開的。
  7. 組件間複雜依賴: 項目包含相互依賴的子組件時,Shell Scripting 難以有效管理。
  8. 大量文件操作: Bash 對文件的處理主要限於串行、逐行操作,效率較低。
  9. 複雜數據結構: 不原生支持多維數組,也缺乏鏈接列表或樹等複雜數據結構的原生支持。
  10. 圖形界面與硬件訪問: 無法生成或操縱圖形界面(GUI),也無法直接訪問系統硬件或外部設備。
  11. 網絡與遺留代碼: Shell 腳本不原生支持端口或套接字 I/O,與現有庫或遺留代碼的接口也較困難。
  12. 閉源應用: Shell 腳本源碼是公開的,不適合需要隱藏源碼的專有應用。

若面臨上述任何情況,指南建議考慮使用更強大的腳本語言(如 Perl, Tcl, Python, Ruby)或編譯型語言(如 C, C++, Java)。但即便如此,先用 Shell 腳本進行原型化測試仍可能是一個有用的開發步驟。

關於 Shell 的選擇,指南專注於 Bash (Bourne-Again shell),這是大多數 UNIX 變體上的事實標準,並從 Korn Shell 繼承了部分特性。使用 #!/bin/sh 作為 She-bang 行可以提高腳本在不同 UNIX 系統間的可移植性,但這會犧牲 Bash 特有的功能,使得腳本僅符合 POSIX sh 標準。指南特別提及並建議避免使用 C Shell 及其變體進行 Scripting,因為其存在固有問題。

文件的開頭幾章(「基礎」部分)著重介紹了 Shell Scripting 的基本構件:She-bang (#!) 的作用及其用法,註釋(#),命令分隔符(;),變量(定義、引用、不同類型,強調 Bash 變量無類型特點),引用機制(單引號 '' 和雙引號 ""),轉義字符(\),腳本和命令的退出狀態(exit$?),測試結構([ [[ ((test 命令,文件測試、字符串比較、整數比較),以及基本的操作符(算術、邏輯、位運算)。這些基礎知識是編寫任何 Shell 腳本的起點,指南通過豐富的範例和練習幫助讀者掌握它們。

最後,指南本身的一大特點和重要聲明是其版權狀態——它被明確地授予 Public Domain (公共領域),不保留任何版權。這允許這份文檔被自由地複製、分發和使用。