> For the complete documentation index, see [llms.txt](https://bash.netdpi.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bash.netdpi.net/di-yi-bu-dao-du/di-yi-zhang-shell-cheng-shi-she-ji.md).

# 第一章、shell 程式設計

沒有一種程式語言是可以萬用的，每個程式語言各有所長，工欲善其事，必先利其器。

\--Herbert Mayer

對於想要相當熟練地掌握系統管理的人，即使他們並不預期需要實際編寫 script，難免也是會需要操作 script。想想當Linux機器啟動時，它會執行 /etc/re.d 中的shell script來恢復系統配置和設定服務。詳細瞭解這些啟動 script 對於分析系統的行為，以及修改系統是很重要的。

Script 的技巧不難掌握，因為 script 可以按照小小部分構建，而且只有少數特定的 shell 操作元與選項會不好學。其語法很簡單（甚至很簡潔）類似在命令列中呼叫和連結公用程式，而且只有幾個「法則」在規範如何使用它們。大多數的簡短 script 可以一次寫好就順利執行，即使是較長的 script 也是很直覺的。

在個人電腦早期，BASIC語言使任何有相當熟練的電腦玩家都能在早期的微電腦上編寫程式。幾十年後，Bash script 語言使任何對Linux或UNIX有初步瞭解的人都能在現代機器上做同樣的事情。

我們現在有微型單板電腦，功能驚人，例如樹莓派。

Bash script 是探索這些引人入勝的裝置功能的方法。

Shell script 是一種快速而簡潔的方法，可用來製作複雜應用的原型。讓有限的功能子集在指令碼中工作，這通常是專案開發的第一階段。這樣，可以測試並修改應用程式的結構，並在繼續使用 C、C++、Java、Perl或Python的最終編碼之前發現主要缺陷。

Shell script 回到了傳統的UNIX哲學：將複雜的專案分解為更簡單的子作業，將元件和公用程式連結在一起。很多人認為，比起使用新一代功能強大的多合一語言(比如Perl)，這種語言更適合解決問題，或者說至少從美學角度來看更令人愉悅。這種語言試圖讓所有人擁有一切，但代價是不得不改變你的思維過程，以適應此工具。

根據Herbert Mayer的說法，「有用的語言需要陣列（array）、指標（pointer）和通用機制來構建資料結構。」如果根據這些標準，shell script 還算不上是「有用」的程式語言，或可能連程式語言都稱不上 ...

### 何時不要使用 shell script

* 資源密集型任務，特別是在執行速度很關鍵的情況(排序、雜湊、遞回……)
* 涉及繁重的數學運算的程式，特別是浮點運算、任意精度計算或複數(請改用C++或FORTRAN)
* 需要跨平台可攜性(請改用C或Java)
* 複雜的應用，其中需要結構化程式設計（變數的型別檢查、函式原型等）
* 關鍵任務型應用程式，您寄希望於公司的未來
* 安全性很重要，需要保證系統的完整性，防止侵入、破解和破壞的情況
* 專案包含具有互鎖相依性的子元件
* 需要大量的檔案操作(Bash僅限於序列檔案存取，且僅適用於
* 特別笨拙而沒有效率的風格，一行又一行的處理。
* 需要原生支援多維陣列
* 需要資料結構，例如鏈結串列（linked list）或樹狀結構
* 需要產生/處理圖形或圖形化使用者介面
* 需要直接存取系統硬體或外部周邊裝置
* 需要連線埠或 socket I/0
* 需要使用舊版程式碼的函式庫或介面
* 專有、封閉式原始碼的應用程式（Shell script 將原始碼完全公開，讓全世界都能看到）。

如果以上任何一種情況適用，請考慮使用功能更強大的指令碼語言 — 可能為Perl、Tel、Python、Ruby — 或者可能是編譯後的語言，例如C、C++或Java。即便如此，將應用程式的原型以 shell script 來寫，仍可能是一個有用的開發步驟。

我們將使用Bash，它是「Bourne-Again shell」的縮寫 \[3l] ，也是史蒂芬·伯恩（Stephen Bourne）如今經典的 Bourne shell 的雙關語。Bash 已經成為大多數 UNIX 的 shell sciprt 的實際標準。 本書所涵蓋的大部分原則同樣適用於其他 shell 撰寫的 script，如 Korn Shell，Bash的一些功能就是從這個 shell 中獲得的；ill 和 C Shell 及其變體。（請注意，由於Tom Christiansen在1993年10月的Usenet文章中指出，由於某些固有的問題，不建議使用 C Shell。 ）

接下來是關於 shell script 編寫的一個教學。它重度依賴範例來說明 shell 的各種功能。這些 script 範例是很管用的（已經盡量測試過了），其中一些甚至可以直接應用在現實生活。讀者可以從程式碼封存檔取得可以實際運作的原始碼來玩 (scriptname. sh 或 scriptname.bash)，\[我將它們的權限設定為可執行(chmod u+rx scriptname)，然後執行它們看看會怎樣。如果來源封存無法使用，則從 HTML 或 PDF 格式版本將程式碼剪下並貼上。請注意，此處介紹的某些 script 會有用到一些還未經解釋的功能，這可能會需要讀者暫時先不用理解，先跳過，先掌握精神。

除非另有說明，不然本文後續的 script 範例都是作者親自寫的。

*His countenance was bold and bashed not.*

— 埃德蒙·斯賓塞（Edmund Spenser）


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://bash.netdpi.net/di-yi-bu-dao-du/di-yi-zhang-shell-cheng-shi-she-ji.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
