在Linux 系統中,Shell 是使用者與系統核心之間進行互動的介面,是整個Linux 系統中非常重要的組成部分。Shell 指令稿程式設計成為一個優秀的系統管理員和Linux開發者必須掌握的技術之一。
本書由具有十幾年實作經驗的最前線工程師撰寫,以實用性為主旨。從最基本的Shell 程式設計環境的架設和變數開始,一直到
Shell 指令稿的偵錯技術,由淺入深,系統地介紹了Shell 程式設計各個方面的基礎知識。最後透過2 個實際的綜合實例,向讀者介紹如何使用Shell 指令稿來解決實際問題。
適合閱讀本書的讀者:
◎ 需要全面學習Shell 程式設計技術的人員
◎ 廣大Linux 程式設計師
◎ Linux 系統管理員
◎ 網站管理工程師
◎ 希望加強Linux 系統管理和開發水準的人員
◎ 專業教育訓練機構的學員
◎ Linux 下的所有程式設計人員
◎ 需要一本案頭必備查詢手冊的人員
作者序
前言
隨著網際網路技術的發展,Linux 已經逐步成為主流的伺服器作業系統。在Linux 系統中,Shell 是使用者與系統核心之間進行互動的介面,是整個Linux 系統中非常重要的組成部分。Shell 指令稿程式設計成為一個優秀的系統管理員和Linux開發者必須掌握的技術之一。Bash Shell 已經成為絕大部分Linux 系統預設的Shell程式,本書旨在系統介紹Shell 程式設計的相關知識和技巧。
在Shell 發展的幾十年中,出現了許多介紹Shell 程式設計的書籍。但是,其內容並沒有隨著技術的發展而獲得補充。另外,許多書籍不是偏重理論,缺乏實作性;就是泛泛而論,缺乏深入的闡述。本書由具有十幾年實作經驗的最前線工程師撰寫,以實用性為主旨。從最基本的Shell 程式設計環境的架設和變數開始,一直到
Shell 指令稿的偵錯技術,由淺入深,系統地介紹了Shell 程式設計各個方面的基礎知識。最後透過2 個實際的綜合實例,向讀者介紹如何使用Shell 指令稿來解決實際問題。
本書特色
1. 內容全面,系統性強
本書非常全面地討論了Shell 程式設計各個方面,基本上涵蓋了與Shell 程式設計有關的所有重要的基礎知識。
2. 深入淺出,循序漸進
對絕大部分的初學者來說,Shell 程式設計是一件非常困難的事情。本書從最基本的基礎知識開始講起,一直到最後的Shell 指令稿偵錯技術。在介紹某個基礎知識的時候,也儘量從最簡單的內容開始,逐步深入,避免使初學者產生畏懼的心理。
3. 由第一線工程師撰寫,重實作,實用性強
本書以目前最為流行的Bash Shell 為基礎,針對Shell 程式設計中最容易遇到的問題,依次展開論述。無論是初學者,還是具有一定經驗的Linux 開發和維護人員,都可以從中獲得有用的知識。
4. 重點突出,脈絡清晰
對於比較重要的基礎知識,本書都進行了非常深入的探討和程式示範,讓讀者不僅知其然,更要知其所以然,只有這樣,才能達到融會貫通的境界。
5. 專案案例具代表性,實戰性強,高應用價值
最後一篇提供了2 個綜合案例。這些案例來自作者所開發的實際專案,具有很高的應用價值和參考性。這些案例分別使用不同的框架組合實現,便於讀者融會貫通地了解本書中所介紹的技術。稍加修改,便可用於實際專案開發中。
本書內容及知識系統
第1 篇 認識Shell 程式設計(第1 ∼ 2 章)
本篇主要介紹了Shell 入門的基礎和Shell 程式設計環境的架設。主要包含什麼是Shell、為什麼要學習Shell 程式設計、最簡單的Shell 程式的組成、如何在不同的作業系統上面架設Shell 程式設計環境,以及編輯器的選擇等。
第2 篇 Shell 程式設計基礎(第3 ∼ 13 章)
本篇主要介紹了Shell 程式設計所有關的所有重要的基礎知識。主要包含Shell變數、條件測試和判斷敘述、循環結構、函數、陣列、正規表示法、基本文字處理、流編輯、awk 工具、檔案操作,以及子Shell 與處理程序處理等。
第3 篇 Shell 程式設計實戰(第14 ∼ 15 章)
本篇主要介紹了Shell 指令稿的偵錯技術及2 個綜合實例。主要包含Shell 程式設計常見問題、4 種常用的Shell 指令稿偵錯技術。綜合實例包含系統服務指令稿,以及Apache 記錄檔管理指令稿的撰寫方法。
適合閱讀本書的讀者
1. 需要全面學習Shell 程式設計技術的人員;
2. 廣大Linux 程式設計師;
3. Linux 系統管理員;
4. 網站管理工程師;
5. 希望加強Linux 系統管理和開發水準的人員;
6. 專業教育訓練機構的學員;
7. Linux 下的所有程式設計人員;
8. 需要一本案頭必備查詢手冊的人員。
閱讀本書的建議
◎ 沒有Linux 程式設計基礎的讀者,建議從第1 章依序閱讀並演練每一個實例。
◎ 擁有一定Linux 程式設計基礎的讀者,可以根據需求選擇閱讀各個章節及實例。
◎對於每一個基礎知識和實例,先自己思考一下實現的想法,然後再閱讀,學習
效果會更好。
◎Shell 程式設計非常需要大量的實際操作,並且每項功能都會有多種實現方法。
讀者可以在閱讀本書基礎知識以及實例的基礎上,對本書的實例進行改編,以其他的方式實現實例的功能。這樣了解起來就更加容易,也會更加深刻。
前言
隨著網際網路技術的發展,Linux 已經逐步成為主流的伺服器作業系統。在Linux 系統中,Shell 是使用者與系統核心之間進行互動的介面,是整個Linux 系統中非常重要的組成部分。Shell 指令稿程式設計成為一個優秀的系統管理員和Linux開發者必須掌握的技術之一。Bash Shell 已經成為絕大部分Linux 系統預設的Shell程式,本書旨在系統介紹Shell 程式設計的相關知識和技巧。
在Shell 發展的幾十年中,出現了許多介紹Shell 程式設計的書籍。但是,其內容並沒有隨著技術的發展而獲得補充。另外,許多書籍不是偏重理論,缺乏實作性;...
目錄
第1 篇 認識Shell 程式設計
01 Shell 入門基礎
1.1 為什麼學習和使用Shell 程式設計
1.2 什麼是Shell
1.2.1 Shell 的起源
1.2.2 Shell 的功能
1.2.3 Shell 的分類
1.3 作為程式語言的Shell
1.3.1 互動式程式
1.3.2 建立指令稿
1.3.3 把指令稿設定為可執行
1.4 向指令稿傳遞參數
1.4.1 Shell 指令稿的參數
1.4.2 參數擴充
1.5 第一個Shell 程式:Hello,Bash Shell!
1.5.1 Shell 指令稿的基本元素
1.5.2 指定指令解讀器
1.5.3 Shell 指令稿中的註釋和風格
1.5.4 如何執行Shell 程式
1.5.5 Shell 程式的退出狀態
1.6 小結
02 Shell 程式設計環境的架設
2.1 在不同的作業系統上架設Shell 程式設計環境
2.1.1 在Windows 上架設Shell 程式設計環境
2.1.2 在Linux 上架設Shell 程式設計環境
2.1.3 在FreeBSD 上架設Shell 程式設計環境
2.2 編輯器的選擇
2.2.1 圖形化編輯器
2.2.2 vi(vim)編輯器
2.3 系統環境的架設
2.3.1 Shell 設定檔
2.3.2 指令別名 -33
2.4 小結
第2 篇 Shell 程式設計基礎
03 變數和參考
3.1 深入認識變數
3.1.1 什麼是變數
3.1.2 變數的命名
3.1.3 變數的類型
3.1.4 變數的定義
3.1.5 變數和引號
3.1.6 變數的作用域
3.1.7 系統變數
3.1.8 環境變數
3.2 變數設定值和清空
3.2.1 變數設定值
3.2.2 參考變數的值
3.2.3 清除變數
3.3 參考和取代
3.3.1 參考
3.3.2 全參考
3.3.3 部分參考
3.3.4 指令取代
3.3.5 逸出
3.4 小結
04 條件測試和判斷敘述
4.1 條件測試
4.1.1 條件測試的基本語法
4.1.2 字串測試
4.1.3 整數測試
4.1.4 檔案測試
4.1.5 邏輯運算符號
4.2 條件判斷敘述
4.2.1 使用簡單的if 敘述進行條件判斷
4.2.2 使用if else 敘述進行流程控制
4.2.3 使用if elif 敘述進行多條件判斷
4.2.4 使用exit 敘述退出程式
4.3 多條件判斷敘述case
4.3.1 多條件判斷敘述case 的基本語法
4.3.2 利用case 敘述處理選項參數
4.3.3 利用case 敘述處理使用者輸入
4.4 運算符號
4.4.1 算術運算子
4.4.2 位元運算符號
4.4.3 自動增加/ 自減運算子
4.4.4 數字常數的進位
4.5 小結
05 循環結構
5.1 步進循環敘述for
5.1.1 帶列表的for 循環敘述
5.1.2 不帶列表的for 循環敘述
5.1.3 類似C 風格的for 循環敘述
5.1.4 使用for 循環敘述處理陣列
5.2 until 循環敘述
5.2.1 until 敘述的基本語法
5.2.2 利用until 敘述批次增加使用者
5.3 while 循環敘述
5.3.1 while 敘述的基本語法
5.3.2 透過計數器控制while 循環結構
5.3.3 透過結束標記控制while 循環結構
5.3.4 了解while 敘述與until 敘述的區別
5.4 巢狀循環
5.5 利用break 和continue 敘述控制循環
5.5.1 利用break 敘述控制循環
5.5.2 利用continue 敘述控制循環
5.5.3 分析break 敘述和continue 敘述的區別
5.6 小結
06 函數
6.1 函數
6.1.1 什麼是函數
6.1.2 函數的定義
6.1.3 函數的呼叫
6.1.4 函數連結
6.1.5 函數的傳回值
6.1.6 函數和別名
6.1.7 再議全域變數和區域變數
6.2 函數參數
6.2.1 含有參數的函數的呼叫方法
6.2.2 取得函數參數的個數
6.2.3 透過位置變數接收參數值
6.2.4 移動位置參數
6.2.5 透過getopts 接收函數參數
6.2.6 間接參數傳遞
6.2.7 透過全域變數傳遞資料
6.2.8 傳遞陣列參數
6.3 函數程式庫檔案
6.3.1 函數程式庫檔案的定義
6.3.2 函數程式庫檔案的呼叫
6.4 遞歸函數
6.5 小結
07 陣列
7.1 定義陣列
7.1.1 透過指定元素值來定義陣列
7.1.2 透過declare 敘述定義陣列
7.1.3 透過元素值集合定義陣列
7.1.4 透過鍵值對定義陣列
7.1.5 陣列和普通變數
7.2 陣列的設定值
7.2.1 按索引為元素設定值
7.2.2 透過集合為陣列設定值
7.2.3 在陣列尾端追加新元素
7.2.4 透過循環為陣列元素設定值
7.3 存取陣列
7.3.1 存取第1 個陣列元素
7.3.2 透過索引存取陣列元素
7.3.3 計算陣列的長度
7.3.4 透過循環檢查陣列元素
7.3.5 參考所有的陣列元素
7.3.6 以切片方式取得部分陣列元素
7.3.7 陣列元素的取代
7.4 刪除陣列
7.4.1 刪除指定陣列元素
7.4.2 刪除整個陣列
7.5 陣列的其他操作
7.5.1 複製陣列
7.5.2 連接陣列
7.5.3 載入檔案內容到陣列
7.6 小結
08 正規表示法
8.1 什麼是正規表示法
8.1.1 為什麼使用正規表示法
8.1.2 如何學習正規表示法
8.1.3 如何實作正規表示法
8.2 正規表示法基礎
8.2.1 正規表示法的原理
8.2.2 基本正規表示法
8.2.3 擴充正規表示法
8.2.4 Perl 正規表示法
8.2.5 正規表示法字元集
8.3 正規表示法應用
8.3.1 比對單一字元
8.3.2 比對多個字元
8.3.3 比對字串的開頭或結尾
8.3.4 運算子優先順序
8.3.5 子運算式
8.3.6 萬用字元
8.4 grep 指令
8.4.1 grep 指令的基本語法
8.4.2 grep 指令族簡介
8.5 小結
09 基本文字處理
9.1 使用echo 指令輸出文字
9.1.1 顯示普通字串
9.1.2 顯示逸出字元 數
9.1.4 換行和不換行
9.1.5 顯示指令執行結果
9.1.6 echo 指令執行結果的重新導向
9.2 文字的格式化輸出
9.2.1 使用UNIX 定位字元
9.2.2 使用fold 指令格式化行
9.2.3 使用fmt 指令格式化段落
9.2.4 使用rev 指令反轉字元順序
9.2.5 使用pr 指令格式化文字頁
9.3 使用sort 指令對文字排序
9.3.1 sort 指令的基本用法
9.3.2 使用單一關鍵字排序
9.3.3 根據指定的列排序
9.3.4 根據關鍵字降冪排序
9.3.5 數值列的排序
9.3.6 自訂列分隔符號
9.3.7 刪除重複的行
9.3.8 根據多個關鍵字排序
9.3.9 使用sort 指令合併檔案
9.4 文字的統計
9.4.1 輸出含有行號的文字行
9.4.2 統計行數
9.4.3 統計單字數和字元數
9.5 使用cut 指令選取文字列
9.5.1 cut 指令及其語法
9.5.2 選擇指定的文字列
9.5.3 選擇指定數量的字元
9.5.4 排除不包含列分隔符號的行
9.6 使用paste 指令連接文字列
9.6.1 paste 指令及其語法
9.6.2 自訂列分隔符號
9.6.3 連接指定的文字列
9.7 使用join 指令聯接文字列
9.7.1 join 指令及其語法
9.7.2 指定聯接關鍵字列
9.7.3 內聯接文字檔
9.7.4 左聯接文字檔
9.7.5 右聯接文字檔
9.7.6 全聯接文字檔
9.7.7 自訂輸出列
9.8 使用tr 指令取代檔案內容
9.8.1 tr 指令及其語法
9.8.2 去除重複出現的字元
9.8.3 刪除空行
9.8.4 大小寫轉換
9.8.5 刪除指定字元
9.9 小結 9
10 串流編輯
10.1 sed 指令及其語法
10.1.1 sed 指令以及語法
10.1.2 sed 指令的工作方式
10.1.3 使用行號定位文字行
10.1.4 使用正規表示法定位文字行
10.2 sed 指令的常用操作
10.2.1 sed 編輯指令基本語法
10.2.2 選擇文字
10.2.3 取代文字
10.2.4 刪除文字
10.2.5 追加文字
10.2.6 插入文字
10.3 組合指令
10.3.1 使用-e 選項執行多個子指令
10.3.2 使用分號執行多個子指令
10.3.3 對一個位址使用多個子指令
10.3.4 sed 指令檔
10.4 小結
11 文字處理利器awk 指令
11.1 awk 入門
11.1.1 awk 的功能
11.1.2 awk 指令的基本語法
11.1.3 awk 的工作流程
11.1.4 執行awk 程式的幾種方式
11.2 awk 的模式比對
11.2.1 關聯運算式
11.2.2 正規表示法
11.2.3 混合模式
11.2.4 區間模式
11.2.5 BEGIN 模式
11.2.6 END 模式
11.3 變數
11.3.1 變數的定義和參考
11.3.2 系統內建變數
11.3.3 記錄分隔符號和欄位分隔符號
11.3.4 記錄和欄位的參考
11.4 運算子和運算式
11.4.1 算術運算子
11.4.2 設定運算子
11.4.3 條件運算子
11.4.4 邏輯運算子
11.4.5 關係運算子
11.4.6 其他運算子
11.5 函數
11.5.1 字串函數
11.5.2 算術函數
11.6 陣列
11.6.1 陣列的定義和設定值
11.6.2 檢查陣列
11.7 流程控制
11.7.1 if 敘述
11.7.2 while 敘述
11.7.3 do⋯while 敘述
11.7.4 for 敘述
11.7.5 break 敘述
11.7.6 continue 敘述
11.7.7 next 敘述
11.7.8 exit 敘述
11.8 awk 程式的格式化輸出
11.8.1 基本print 敘述
11.8.2 格式化輸出printf 敘述
11.8.3 使用sprintf() 函數產生格式化字串
11.9 awk 的程式與Shell 的互動
11.9.1 透過管線實現與Shell 的交換
11.9.2 透過system 函數實現與Shell 的互動
11.10 小結
12 檔案的操作
12.1 檔案
12.1.1 列出檔案
12.1.2 檔案類型
12.1.3 檔案的許可權
12.2 搜索檔案
12.2.1 find 指令以及語法
12.2.2 find 指令:路徑
12.2.3 find 指令:測試
12.2.4 find 指令:使用! 運算子對測試求相反條件
12.2.5 find 指令:處理檔案許可權錯誤訊息
12.2.6 find 指令:動作
12.3 比較檔案
12.3.1 使用comm 比較檔案
12.3.2 使用diff 比較檔案
12.4 檔案描述符號
12.4.1 什麼是檔案描述符號
12.4.2 標準輸入、標準輸出和標準錯誤
12.5 重新導向
12.5.1 輸出重新導向(覆蓋)
12.5.2 輸出重新導向(追加)
12.5.3 輸入重新導向
12.5.4 目前文件
12.5.5 重新導向兩個檔案描述符號
12.5.6 使用exec 指令分配檔案描述符號
12.6 小結
13 子Shell 與處理程序處理
13.1 子Shell
13.1.1 什麼是子Shell
13.1.2 內部指令、保留字和外部指令
13.1.3 在子Shell 中執行指令
13.1.4 把子Shell 中的變數值傳回父Shell
13.2 處理程序處理
13.2.1 什麼是處理程序
13.2.2 透過指令稿監控處理程序
13.2.3 作業控制
13.2.4 訊號與trap 指令
13.3 小結
第3 篇 Shell 程式設計實戰
14 Shell 指令稿偵錯技術
14.1 Shell 指令稿中的常見錯誤
14.1.1 常見語法錯誤
14.1.2 常見邏輯錯誤
14.2 Shell 指令稿偵錯技術
14.2.1 使用echo 指令偵錯指令稿
14.2.2 使用trap 指令偵錯Shell 指令稿
14.2.3 使用tee 指令偵錯Shell 指令稿
14.2.4 使用偵錯鉤子偵錯Shell 指令稿
14.3 小結
15 利用Shell 指令稿解決實際問題
15.1 撰寫系統服務指令稿
15.1.1 系統啟動過程
15.1.2 執行等級
15.1.3 服務指令稿的基本語法
15.1.4 撰寫MySQL 服務指令稿
15.2 透過指令稿管理Apache 伺服器記錄檔
15.2.1 Apache 以及記錄檔簡介
15.2.2 備份歸檔檔案名稱產生函數
15.2.3 過期記錄檔備份歸檔函數
15.2.4 過期記錄檔刪除函數
15.2.5 記錄檔歸檔主程式
15.2.6 定時執行記錄檔歸檔指令稿
15.3 小結
第1 篇 認識Shell 程式設計
01 Shell 入門基礎
1.1 為什麼學習和使用Shell 程式設計
1.2 什麼是Shell
1.2.1 Shell 的起源
1.2.2 Shell 的功能
1.2.3 Shell 的分類
1.3 作為程式語言的Shell
1.3.1 互動式程式
1.3.2 建立指令稿
1.3.3 把指令稿設定為可執行
1.4 向指令稿傳遞參數
1.4.1 Shell 指令稿的參數
1.4.2 參數擴充
1.5 第一個Shell 程式:Hello,Bash Shell!
1.5.1 Shell 指令稿的基本元素
1.5.2 指定指令解讀器
1.5.3 Shell 指令稿中的註釋和風格
1.5.4 如何執行Shell 程式
1.5.5 Shel...