本文檔的最新版本是作爲一個歸檔文件bzip2-ed, "tar包"來發布的, 其中還包括SGML源代碼和編譯好的HTML版本. 讀者可以從作者的主頁上下載. pdf版本也可以從作者的主頁上下載. 查看change log來查看校訂歷史.
- 目錄
- 序
- 1. 原書作者致中國讀者(英文)
- 2. 原書作者致中國讀者(譯文)
- 3. 黃毅
- 4. 楊春敏
- 第一部分. 熱身
- 第二部分. 基本
- 第三部分. 進階
- 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. 外部過濾器, 程序和命令
- 13. 系統與管理命令
- 13.1. 分析一個系統腳本
- 14. 命令替換
- 15. 算術擴展
- 16. I/O重定向
- 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
- 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
- 35. 後記
- 35.1. 作者後記
- 35.2. 關於作者
- 35.3. 譯者後記
- 35.4. 在哪裏可以獲得幫助
- 35.5. 用來製作這本書的工具
- 35.6. 致謝
- 35.7. 譯者致謝
- ······························································································································································································································································································································
- 參考文獻
- A. 捐獻的腳本
- B. 參考卡片
- C. 一個學習Sed和Awk的小手冊
- D. 帶有特殊含義的退出碼
- E. I/O和I/O重定向的詳細介紹
- F. 命令行選項
- G. 重要的文件
- H. 重要的系統目錄
- I. 本地化
- J. 歷史命令
- K. 一個簡單的.bashrc文件
- L. 將DOS批處理文件轉換爲Shell腳本
- M. 練習
- N. 修訂記錄
- O. 翻譯版修訂記錄
- P. 鏡像站點
- Q. To Do列表
- R. 版權
- 表格清單
- 11-1. 作業標識符
- 30-1. Bash選項
- 33-1. 轉義序列中顏色與數值的對應
- B-1. 特殊的shell變量
- B-2. 測試操作: 二元比較
- B-3. 文件類型的測試操作
- B-4. 參數替換和擴展
- B-5. 字符串操作
- B-6. 一些結構的彙總
- C-1. 基本sed操作
- C-2. sed操作符舉例
- D-1. "保留的"退出碼
- L-1. 批處理文件關鍵字 / 變量 / 操作符, 和等價的shell符號
- L-2. DOS命令與UNIX的等價命令
- N-1. 修訂歷史
- O-1. 翻譯版修訂歷史
- 例子清單
- 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. wh, whois節點名字查詢
- 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. break和continue命令在循環中的效果
- 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. basename和dirname
- 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在同一個腳本中重定向stdin和stdout
- 16-4. 避免子shell
- 16-5. while循環的重定向
- 16-6. 重定向while循環的另一種形式
- 16-7. 重定向until循環
- 16-8. 重定向for循環
- 16-9. 重定向for循環(stdin和stdout都進行重定向)
- 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. 打印服務器環境