高級Bash腳本編程指南 在線收藏版

這本書假定你沒有任何關於腳本或一般程序的編程知識, 但是如果你具備相關的知識, 那麼你將很容易就能夠達到中高級的水平. . . 所有這些只是UNIX®浩瀚知識的一小部分. 你可以把本書作爲教材, 自學手冊, 或者是關於shell腳本技術的文檔. 書中的練習和樣例腳本中的註釋將會與讀者進行更好的互動, 但是最關鍵的前提是: 想真正學習腳本編程的唯一途徑就是親自動手編寫腳本.
這本書也可作爲教材來講解一般的編程概念.

本文檔的最新版本是作爲一個歸檔文件bzip2-ed"tar包"來發布的, 其中還包括SGML源代碼和編譯好的HTML版本. 讀者可以從作者的主頁上下載. pdf版本也可以從作者的主頁上下載. 查看change log來查看校訂歷史.

目錄
1. 原書作者致中國讀者(英文)
2. 原書作者致中國讀者(譯文)
3. 黃毅
4. 楊春敏
第一部分. 熱身
1. 爲什麼使用shell編程?
2. 帶着一個Sha-Bang出發(Sha-Bang指的是#!)
2.1. 調用一個腳本
2.2. 初步的練習
第二部分. 基本
3. 特殊字符
4. 變量和參數的介紹
4.1. 變量替換
4.2. 變量賦值
4.3. Bash變量是不區分類型的
4.4. 特殊的變量類型
5. 引用
5.1. 引用變量
5.2. 轉義
6. 退出和退出狀態碼
7. 條件判斷
7.1. 條件測試結構
7.2. 文件測試操作符
7.3. 其他比較操作符
7.4. 嵌套的if/then條件測試
7.5. 檢測你對測試知識的掌握情況
8. 操作符與相關主題
8.1. 操作符
8.2. 數字常量
第三部分. 進階
9. 變量重遊
9.1. 內部變量
9.2. 操作字符串
9.3. 參數替換
9.4. 指定變量的類型: 使用declare或者typeset
9.5. 變量的間接引用
9.6. $RANDOM: 產生隨機整數
9.7. 雙圓括號結構
10. 循環與分支
10.1. 循環
10.2. 嵌套循環
10.3. 循環控制
10.4. 測試與分支(case與select結構)
11. 內部命令與內建命令
11.1. 作業控制命令
12. 外部過濾器, 程序和命令
12.1. 基本命令
12.2. 複雜命令
12.3. 時間/日期 命令
12.4. 文本處理命令
12.5. 文件與歸檔命令
12.6. 通訊命令
12.7. 終端控制命令
12.8. 數學計算命令
12.9. 混雜命令
13. 系統與管理命令
13.1. 分析一個系統腳本
14. 命令替換
15. 算術擴展
16. I/O重定向
16.1. 使用exec
16.2. 代碼塊重定向
16.3. 重定向的應用
17. Here Document
17.1. Here String
18. 休息片刻
第四部分. 高級主題
19. 正則表達式
19.1. 一份簡要的正則表達式介紹
19.2. 通配(globbing)
20. 子shell
21. 受限shell
22. 進程替換
23. 函數
23.1. 複雜函數和函數複雜性
23.2. 局部變量
23.3. 不使用局部變量的遞歸
24. 別名
25. 列表結構
26. 數組
27. /dev和/proc
27.1. /dev
27.2. /proc
28. Zero與Null
29. 調試
30. 選項
31. 陷阱
32. 腳本編程風格
32.1. 非官方的Shell腳本編寫風格
33. 雜項
33.1. 交互與非交互式的交互與非交互式的shell和腳本
33.2. Shell包裝
33.3. 測試和比較: 一種可選的方法
33.4. 遞歸
33.5. 將腳本"彩色化"
33.6. 優化
33.7. 各種小技巧
33.8. 安全問題
33.9. 可移植性問題
33.10. Windows下的shell腳本
34. Bash, 版本2與版本3
34.1. Bash, 版本2
34.2. Bash, 版本3
35. 後記
35.1. 作者後記
35.2. 關於作者
35.3. 譯者後記
35.3.1. 楊春敏
35.3.2. 黃毅
35.4. 在哪裏可以獲得幫助
35.5. 用來製作這本書的工具
35.5.1. 硬件
35.5.2. 軟件與排版軟件
35.6. 致謝
35.7. 譯者致謝
······························································································································································································································································································································
參考文獻
A. 捐獻的腳本
B. 參考卡片
C. 一個學習Sed和Awk的小手冊
C.1. Sed
C.2. Awk
D. 帶有特殊含義的退出碼
E. I/O和I/O重定向的詳細介紹
F. 命令行選項
F.1. 標準命令行選項
F.2. Bash命令行選項
G. 重要的文件
H. 重要的系統目錄
I. 本地化
J. 歷史命令
K. 一個簡單的.bashrc文件
L. 將DOS批處理文件轉換爲Shell腳本
M. 練習
M.1. 分析腳本
M.2. 編寫腳本
N. 修訂記錄
O. 翻譯版修訂記錄
P. 鏡像站點
Q. To Do列表
R. 版權
例子清單
2-1. 清除: 清除/var/log下的log文件
2-2. 清除:一個改良的清除腳本
2-3. 清除: 一個增強的和廣義的刪除logfile的腳本
3-1. 代碼塊和I/O重定向
3-2. 將一個代碼塊的結果保存到文件
3-3. 在後臺運行一個循環
3-4. 備份最後一天所有修改的文件
4-1. 變量賦值和替換
4-2. 簡單的變量賦值
4-3. 簡單和複雜, 兩種類型的變量賦值
4-4. 整型還是字符串?
4-5. 位置參數
4-6. whwhois節點名字查詢
4-7. 使用shift命令
5-1. echo出一些詭異變量
5-2. 轉義符
6-1. 退出/退出狀態碼
6-2. 反轉一個條件的用法!
7-1. 什麼是真?
7-2. test/usr/bin/test[ ], 和/usr/bin/[都是等價命令
7-3. 算術測試需要使用(( ))
7-4. 測試那些斷掉的鏈接文件
7-5. 算術比較與字符串比較
7-6. 檢查字符串是否爲null
7-7. zmore
8-1. 最大公約數
8-2. 使用算術操作符
8-3. 使用&&和||進行混合條件測試
8-4. 數字常量表示法
9-1. $IFS與空白字符
9-2. 定時輸入
9-3. 再來一個, 定時輸入
9-4. 定時read
9-5. 我是root麼?
9-6. arglist: 通過$*和$@列出所有的參數
9-7. $*$@的不一致的行爲
9-8. $IFS爲空時的$*$@
9-9. 下劃線變量
9-10. 在一個文本文件的段落之間插入空行
9-11. 轉換圖片文件格式, 同時更改文件名
9-12. 將音頻流文件轉換爲ogg各式的文件
9-13. 模擬getopt
9-14. 提取字符串的另一種方法
9-15. 使用參數替換和錯誤消息
9-16. 參數替換和"usage"消息(譯者注: 通常就是幫助信息)
9-17. 變量長度
9-18. 參數替換中的模式匹配
9-19. 修改文件擴展名:
9-20. 使用模式匹配來解析任意字符串
9-21. 對字符串的前綴和後綴使用匹配模式
9-22. 使用declare來指定變量的類型
9-23. 間接引用
9-24. 傳遞一個間接引用給awk
9-25. 產生隨機整數
9-26. 從一幅撲克牌中取出一張隨機的牌
9-27. 兩個指定值之間的隨機數
9-28. 用隨機數來搖單個骰子
9-29. 重新分配隨機數種子
9-30. 使用awk來產生僞隨機數
9-31. C語言風格的變量操作
10-1. 一個簡單的for循環
10-2. 每個[list]元素中都帶有兩個參數的for循環
10-3. 文件信息: 對包含在變量中的文件列表進行操作
10-4. 在for循環中操作文件
10-5. for循環中省略in [list]部分
10-6. 使用命令替換來產生for循環的[list]
10-7. 對於二進制文件的grep替換
10-8. 列出系統上的所有用戶
10-9. 在目錄的所有文件中查找源字串
10-10. 列出目錄中所有的符號鏈接
10-11. 將目錄中所有符號鏈接文件的名字保存到一個文件中
10-12. 一個C風格的for循環
10-13. 在batch mode中使用efax
10-14. 簡單的while循環
10-15. 另一個while循環
10-16. 多條件的while循環
10-17. C風格的while循環
10-18. until循環
10-19. 嵌套循環
10-20. breakcontinue命令在循環中的效果
10-21. 多層循環的退出
10-22. 多層循環的continue
10-23. 在實際的任務中使用"continue N"
10-24. 使用case
10-25. 使用case來創建菜單
10-26. 使用命令替換來產生case變量
10-27. 簡單的字符串匹配
10-28. 檢查輸入字符是否爲字母
10-29. 使用select來創建菜單
10-30. 使用函數中的select結構來創建菜單
11-1. 一個fork出多個自身實例的腳本
11-2. 使用printf的例子
11-3. 使用read來進行變量分配
11-4. 當使用一個不帶變量參數的read命令時, 將會發生什麼?
11-5. read命令的多行輸入
11-6. 檢測方向鍵
11-7. 通過文件重定向來使用read命令
11-8. 管道輸出到read中的問題
11-9. 修改當前工作目錄
11-10. 使用"let"命令來做算術運算.
11-11. 展示eval命令的效果
11-12. 強制登出(log-off)
11-13. 另一個"rot13"版本
11-14. 在Perl腳本中使用eval命令來強制變量替換
11-15. 使用set命令來改變腳本的位置參數
11-16. 反轉位置參數
11-17. 重新分配位置參數
11-18. "Unsett"一個變量
11-19. 使用export命令來將一個變量傳遞到一個內嵌awk的腳本中
11-20. 使用getopts命令來來讀取傳遞給腳本的選項/參數
11-21. "includ"一個數據文件
11-22. 一個(沒什麼用的)source自身的腳本
11-23. exec命令的效果
11-24. 一個exec自身的腳本
11-25. 在繼續處理之前, 等待一個進程的結束
11-26. 一個結束自身的腳本程序
12-1. 使用ls命令來創建一個燒錄CDR的內容列表
12-2. 到底是Hello還是Good-bye
12-3. 糟糕的文件名, 刪除當前目錄下文件名中包含一些糟糕字符(包括空白的文件.
12-4. 通過文件的inode號來刪除文件
12-5. Logfile: 使用xargs來監控系統log
12-6. 把當前目錄下的文件拷貝到另一個文件中
12-7. 通過名字kill進程
12-8. 使用xargs分析單詞出現的頻率
12-9. 使用expr
12-10. 使用date命令
12-11. 分析單詞出現的頻率
12-12. 哪個文件是腳本?
12-13. 產生10-進制隨機數
12-14. 使用tail命令來監控系統log
12-15. 在腳本中模擬"grep"的行爲
12-16. 在1913年的韋氏詞典中查找定義
12-17. 檢查列表中單詞的正確性
12-18. 轉換大寫: 把一個文件的內容全部轉換爲大寫.
12-19. 轉換小寫: 將當前目錄下的所有文全部轉換爲小寫.
12-20. Du: DOS到UNIX文本文件的轉換.
12-21. rot13: rot13, 弱智加密.
12-22. 產生"Crypto-Quote"遊戲(譯者: 一種文字遊戲)
12-23. 格式化文件列表.
12-24. 使用column來格式化目錄列表
12-25. nl: 一個自己計算行號的腳本.
12-26. manview: 查看格式化的man頁
12-27. 使用cpio來拷貝一個目錄樹
12-28. 解包一個rpm歸檔文件
12-29. 從C文件中去掉註釋
12-30. 瀏覽/usr/X11R6/bin
12-31. 一個"改進過"strings命令
12-32. 在一個腳本中使用cmp命令來比較兩個文件.
12-33. basenamedirname
12-34. 檢查文件完整性
12-35. Uudecode編碼後的文件
12-36. 查找濫用的鏈接來報告垃圾郵件發送者
12-37. 分析一個垃圾郵件域
12-38. 獲得一份股票報價
12-39. 更新FC4(Fedora 4)
12-40. 使用ssh
12-41. 一個mail自身的腳本
12-42. 按月償還貸款
12-43. 數制轉換
12-44. 使用"here document"來調用bc
12-45. 計算圓周率
12-46. 將10進制數字轉換爲16進制數字
12-47. 因子分解
12-48. 計算直角三角形的斜邊
12-49. 使用seq命令來產生循環參數
12-50. 字母統計
12-51. 使用getopt來分析命令行選項
12-52. 一個拷貝自身的腳本
12-53. 練習dd
12-54. 記錄按鍵
12-55. 安全的刪除一個文件
12-56. 文件名產生器
12-57. 將長度單位-米, 轉化爲英里
12-58. 使用m4
13-1. 設置一個新密碼
13-2. 設置一個擦除字符
13-3. 保密密碼: 關閉終端對於密碼的echo
13-4. 按鍵檢測
13-5. 掃描遠程機器上的identd服務進程
13-6. 使用pidof命令幫忙kill一個進程
13-7. 檢查一個CD鏡像
13-8. 在一個文件中創建文件系統
13-9. 添加一個新的硬盤驅動器
13-10. umask將輸出文件隱藏起來
13-11. killall, 來自於/etc/rc.d/init.d
14-1. 愚蠢的腳本策略
14-2. 將一個循環輸出的內容設置到變量中
14-3. 找anagram(迴文構詞法, 可以將一個有意義的單詞, 變換爲1個或多個有意義的單詞, 但是還是原來的子母集合)
16-1. 使用exec重定向stdin
16-2. 使用exec來重定向stdout
16-3. 使用exec在同一個腳本中重定向stdinstdout
16-4. 避免子shell
16-5. while循環的重定向
16-6. 重定向while循環的另一種形式
16-7. 重定向until循環
16-8. 重定向for循環
16-9. 重定向for循環(stdinstdout都進行重定向)
16-10. 重定向if/then測試結構
16-11. 用於上面例子的"names.data"數據文件
16-12. 事件紀錄
17-1. 廣播: 將消息發送給每個登陸的用戶
17-2. 虛擬文件: 創建一個2行的虛擬文件
17-3. 使用cat的多行消息
17-4. 帶有抑制tab功能的多行消息
17-5. 使用參數替換的here document
17-6. 上傳一個文件對到"Sunsite"的incoming目錄
17-7. 關閉參數替換
17-8. 生成另外一個腳本的腳本
17-9. Here document與函數
17-10. "匿名"的here Document
17-11. 註釋掉一段代碼塊
17-12. 一個自文檔化(self-documenting)的腳本
17-13. 在一個文件的開頭添加文本
17-14. 分析一個郵箱
20-1. 子shell中的變量作用域
20-2. 列出用戶的配置文件
20-3. 在子shell中進行並行處理
21-1. 在受限模式下運行腳本
23-1. 簡單函數
23-2. 帶參數的函數
23-3. 函數與傳遞給腳本的命令行參數
23-4. 將一個間接引用傳遞給函數
23-5. 對一個傳遞給函數的參數進行解除引用的操作
23-6. 再來一次, 對一個傳遞給函數的參數進行解除引用的操作
23-7. 取兩個數中的最大值
23-8. 將阿拉伯數字轉化爲羅馬數字
23-9. 測試函數最大的返回值
23-10. 比較兩個大整數
23-11. 從username中取得用戶的真名
23-12. 局部變量的可見範圍
23-13. 使用局部變量的遞歸
23-14. 漢諾塔
24-1. 用在腳本中的別名
24-2. unalias: 設置與刪除別名
25-1. 使用"與列表"來測試命令行參數
25-2. 使用"與列表"來測試命令行參數的另一個例子
25-3. "或列表""與列表"結合使用
26-1. 簡單的數組使用
26-2. 格式化一首詩
26-3. 多種數組操作
26-4. 用於數組的字符串操作
26-5. 將腳本的內容賦值給數組
26-6. 一些數組專用的小道具
26-7. 空數組與包含空元素的數組
26-8. 初始化數組
26-9. 拷貝和連接數組
26-10. 關於串聯數組的更多信息
26-11. 一位老朋友: 冒泡排序
26-12. 嵌套數組與間接引用
26-13. 複雜的數組應用: 埃拉托色尼素數篩子
26-14. 模擬一個下推堆棧
26-15. 複雜的數組應用: 探索一個神祕的數學序列
26-16. 模擬一個二維數組, 並使他傾斜
27-1. 利用/dev/tcp來檢修故障
27-2. 找出與給定PID相關聯的進程
27-3. 網絡連接狀態
28-1. 隱藏令人厭惡的cookie
28-2. 使用/dev/zero來建立一個交換文件
28-3. 創建一個ramdisk
29-1. 一個錯誤腳本
29-2. 缺少關鍵字
29-3. test24, 另一個錯誤腳本
29-4. 使用"assert"來測試條件
29-5. 捕獲exit
29-6. Control-C之後, 清除垃圾
29-7. 跟蹤一個變量
29-8. 運行多進程(在對稱多處理器(SMP box)的機器上)
31-1. 數字比較與字符串比較並不相同
31-2. 子shell缺陷
31-3. echo的輸出通過管道傳遞給read命令
33-1. shell包裝
33-2. 稍微複雜一些的shell包裝
33-3. 一個通用的shell包裝, 用來寫日誌文件
33-4. 包裝awd腳本的shell包裝
33-5. 另一個包裝awd腳本的shell包裝
33-6. 將Perl嵌入到Bash腳本中
33-7. 將Bash和Perl腳本寫到同一個文件中
33-8. 遞歸調用自身的(沒用的)腳本
33-9. 遞歸調用自身的(有用的)腳本
33-10. 另一個遞歸調用自身的(有用的)腳本
33-11. 一個"彩色的"地址數據庫
33-12. 畫一個盒子
33-13. 顯示彩色文本
33-14. "賽馬"遊戲
33-15. 返回值小技巧
33-16. 返回多個值的技巧
33-17. 傳遞數組到函數, 從函數中返回數組
33-18. anagram遊戲
33-19. 從shell腳本中調用窗口部件
34-1. 字符串擴展
34-2. 間接變量引用 - 新方法
34-3. 使用間接變量引用的簡單數據庫應用
34-4. 使用數組和其他的小技巧來處理4人隨機打牌
A-1. mailformat: 格式化一個e-mail消息
A-2. rn: 一個非常簡單的文件重命名工具
A-3. blank-rename: 重命名包含空白的文件名
A-4. encryptedpw: 使用一個本地加密口令, 上傳到一個ftp服務器.
A-5. copy-cd: 拷貝一個數據CD
A-6. Collatz序列
A-7. days-between: 計算兩個日期之間天數差
A-8. 構造一個"字典"
A-9. Soundex轉換
A-10. "Game of Life"
A-11. "Game of Life"的數據文件
A-12. behead: 去掉信件與新消息的頭
A-13. ftpget: 通過ftp下載文件
A-14. password: 產生隨機的8個字符的密碼
A-15. fifo: 使用命名管道來做每日的備份
A-16. 使用模操作符來產生素數
A-17. tree: 顯示目錄樹
A-18. string functions: C風格的字符串函數
A-19. 目錄信息
A-20. 面向對象數據庫
A-21. hash函數庫
A-22. 使用hash函數來給文本上色
A-23. 深入hash函數
A-24. 掛載USB keychain型的存儲設備
A-25. 保存weblog
A-26. 保護字符串的字面含義
A-27. 不保護字符串的字面含義
A-28. 鑑定是否是垃圾郵件服務器
A-29. 垃圾郵件服務器獵手
A-30. 使得wget更易用
A-31. 一個"podcasting"(譯者: 指的是在互聯網上發佈音視頻文件, 並允許用戶訂閱並自動接收的方法)腳本
A-32. 基礎回顧
A-33. 一個擴展的cd命令
C-1. 計算字符出現次數
K-1. .bashrc文件樣本
L-1. VIEWDATA.BAT: DOS批處理文件
L-2. viewdata.sh: 轉換自VIEWDATA.BAT的shell腳本
Q-1. 打印服務器環境
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章