Linux Bash腳本編程大全_第1頁
Linux Bash腳本編程大全_第2頁
Linux Bash腳本編程大全_第3頁
Linux Bash腳本編程大全_第4頁
Linux Bash腳本編程大全_第5頁
已閱讀5頁,還剩600頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、譯者序毫無疑問,UNIX/Linux最重要的軟件之一就是shell,目前最流行的shell被稱為Bash(Bourne Again Shell),幾乎所有的Linux和絕大部分的UNIX都可以使用Bash。作為系統(tǒng)與用戶之間的交互接口,shell幾乎是你在UNIX工作平臺上最親密的朋友,因此,學好shell,是學習Linux/UNIX的的開始,并且它會始終伴隨你的工作學習。shell是如此地重要,但令人驚奇的是,介紹shell的書沒有真正令人滿意的。所幸的是,我看到了這本被人稱為abs的書,這本書介紹了bash大量的細節(jié)和廣闊的范圍,我遇到的絕大部分的技術(shù)問題-無論是我忘記的或是以前沒有發(fā)現(xiàn)的

2、-都可以在這本書里找到答案。這本使用大量的例子詳細地介紹了Bash的語法,各種技巧,調(diào)試等等的技術(shù),以循序漸進的學習方式,讓你了解Bash的所有特性,在書中還有許多練習可以引導你思考,以得到更深入的知識。無論你是新手還是老手,或是使用其他語言的程序員,我能肯定你能在此書用受益。而本書除了介紹BASH的知識之外,也有許多有用的關(guān)于Linux/UNIX的知識和其他shell的介紹。在看到本書的英文版后,我決定把它翻譯出來,在Linuxsir論壇上結(jié)識了譯者之一楊春敏共同翻譯這本書,600多頁的書是本大部頭的書,我們花了6個月的業(yè)余時間才翻譯完了。關(guān)于版權(quán)的問題,英文版的作者Mendel Coope

3、r對英文版的版權(quán)做了詳細的約定,請參考:Appendix Q. Copyright。中文版版權(quán)由譯者楊春敏和黃毅共同所有,在遵守英文版版權(quán)相應條款的條件下,歡迎在保留本書譯者名字和版權(quán)說明以非盈利的方式自由發(fā)布此中文版,以盈利目的的所有行為必須聯(lián)系英文作者和兩位中文譯者以獲得許可。本書得以成稿,我(黃毅)要多謝我的女朋友,本該給予她的時間我用來了翻譯,多謝你的理解,你是一個很棒的女朋友!譯者 楊春敏 黃毅2006.5.15Advanced Bash-Scripting Guide一本深入學習shell腳本藝術(shù)的書籍Version 3.7.22005/11/16作者:Mendel Cooperm

4、ail:thegrendeltheriver 這本書假定你沒有任何腳本或一般程序的編程知識,但是如果你有相關(guān)的知識,那么你將很容易達到中高級的水平.all the while sneaking in little snippets of UNIX? wisdom andlore(這句不知道怎么譯).你可以把本書作為教材,自學手冊,或者你獲得shell腳本技術(shù)的文檔.書中的練習和例子腳本中的注釋將會與讀者有更好的互動,但是最關(guān)鍵的前提是:想真正學習腳本編程的唯一途徑就是編寫腳本.這本書也可作為教材來講解一般的編程概念.下載本書最新版本, :/personal.riverusers /thegre

5、ndel/abs-guide-3.7.tar.bz2,這是一個以tar和bzip2進行打包的,并且是以HTML來發(fā)行的.當然,你也可以獲得本書的pdf版本在 :/ /LDP/abs/abs-guide.pdf.可以在 :/personal.riverusers /thegrendel/Change.log中查看修訂歷史.譯者:楊春敏,黃毅mail:chunmin.yanggmail 一直想好好學習一下bash,可惜網(wǎng)上的資料都雜亂不堪,我還是喜歡通過一本書系統(tǒng)的學習.這本書來得正是時候.本書的作者真是非常的嚴謹,從例子里的改進人名單就能看出來.可惜我水平真的是非常有限,好多地方估計譯得都有問題

6、.希望閱讀的朋友們多多提些修改建議.我會盡我的最大努力去修正它.目錄+第一部分. 熱身 1. 為什么使用shell編程 2. 帶著一個Sha-Bang出發(fā)(Sha-Bang指的是#!) 2.1. 調(diào)用一個腳本 2.2. 初步的練習第二部分. 基本 3. 特殊字符 4. 變量和參數(shù)的介紹 4.1. 變量替換 4.2. 變量賦值 4.3. Bash變量是不分類型的 4.4. 特殊的變量類型 5. 引用(翻譯的可能有問題,特指引號) 5.1. 引用變量 5.2. 轉(zhuǎn)義() 6. 退出和退出狀態(tài) 7. Tests 7.1. Test結(jié)構(gòu) 7.2. 文件測試操作 7.3. 其他比較操作 7.4. 嵌套的

7、if/then條件test 7.5. 檢查你的test知識 8. 操作符和相關(guān)的主題 8.1. 操作符 8.2. 數(shù)字常量第三部分. 超越基本 9. 變量重游 9.1. 內(nèi)部變量 9.2. 操作字符串 9.3. 參數(shù)替換 9.4. 指定類型的變量:declare或者typeset 9.5. 變量的間接引用 9.6. $RANDOM: 產(chǎn)生隨機整數(shù) 9.7. 雙圓括號結(jié)構(gòu) 10. 循環(huán)和分支 10.1. 循環(huán) 10.2. 嵌套循環(huán) 10.3. 循環(huán)控制 10.4. 測試與分支(case和select結(jié)構(gòu)) 11. 內(nèi)部命令與內(nèi)建 11.1. 作業(yè)控制命令 12. 外部過濾器,程序和命令 12.1

8、. 基本命令 12.2. 復雜命令 12.3. 時間/日期 命令 12.4. 文本處理命令 12.5. 文件與歸檔命令 12.6. 通訊命令 12.7. 終端控制命令 12.8. 數(shù)學計算命令 12.9. 混雜命令 13. 系統(tǒng)與管理命令 13.1. 分析一個系統(tǒng)腳本 14. 命令替換 15. 算術(shù)擴展 16. I/O 重定向 16.1. 使用exec 16.2. 代碼塊的重定向 16.3. 應用 17. Here Documents 17.1. Here Strings 18. 休息時間Part 4. 高級 19. 正則表達式 19.1. 一個簡要的正則表達式介紹 19.2. 通配 20.

9、子shell(Subshells) 21. 受限shell(Restricted Shells) 22. 進程替換 23. 函數(shù) 23.1. 復雜函數(shù)和函數(shù)復雜性 23.2. 局部變量 23.3. 不使用局部變量的遞歸 24. 別名(Aliases) 25. 列表結(jié)構(gòu) 26. 數(shù)組 27. /dev 和 /proc 27.1. /dev 27.2. /proc 28. 關(guān)于Zeros和Nulls 29. 調(diào)試 30. 選項 31. Gotchas 32. 腳本編程風格 32.1. 非官方的Shell腳本風格 33. 雜項 33.1. 交互式和非交互式的shells和腳本 33.2. Shell

10、 包裝 33.3. 測試和比較: 另一種方法 33.4. 遞歸 33.5. 彩色腳本 33.6. 優(yōu)化 33.7. 各種小技巧 33.8. 安全話題33.8.1.被感染的腳本33.8.2. 隱藏Shell腳本源碼 33.9. 移植話題 33.10. 在Windows下進行Shell編程 34. Bash, 版本 2 和 3 34.1. Bash, 版本2 34.2. Bash, 版本335. 后記 35.1. 作者后記 35.2. 關(guān)于作者 35.3. 哪里可以取得幫助? 35.4. 制作這本書的工具 35.4.1. 硬件 35.4.2. 軟件和排版軟件 35.5. CreditsBiblio

11、graphyA. Contributed ScriptsB. Reference CardsC. A Sed and Awk Micro-Primer C.1. Sed C.2. AwkD. Exit Codes With Special MeaningsE. A Detailed Introduction to I/O and I/O RedirectionF. Standard Command-Line OptionsG. Important FilesH. Important System DirectoriesI. LocalizationJ. History CommandsK. A

12、 Sample .bashrc FileL. Converting DOS Batch Files to Shell ScriptsM. Exercises M.1. Analyzing Scripts M.2. Writing ScriptsN. Revision HistoryO. Mirror SitesP. To Do ListQ. Copyright表格清單:11-1. 作業(yè)標識符30-1. Bash 選項33-1. 轉(zhuǎn)義序列中數(shù)值和彩色的對應B-1. Special Shell VariablesB-2. TEST Operators: Binary ComparisonB-3.

13、TEST Operators: FilesB-4. Parameter Substitution and ExpansionB-5. String OperationsB-6. Miscellaneous ConstructsC-1. Basic sed operatorsC-2. Examples of sed operatorsD-1. Reserved Exit CodesL-1. Batch file keywords / variables / operators, and their shell equivalentsL-2. DOS commands and their UNIX

14、 equivalentsN-1. Revision History例子清單:2-1. 清除:清除/var/log下的log文件2-2. 清除:一個改良的清除腳本2-3. cleanup:一個增強的和廣義的刪除logfile的腳本3-1. 代碼塊和I/O重定向3-2. 將一個代碼塊的結(jié)果保存到文件3-3. 在后臺運行一個循環(huán)3-4. 備份最后一天所有修改的文件.4-1. 變量賦值和替換4-2. 一般的變量賦值4-3. 變量賦值,一般的和比較特殊的4-4. 整型還是string?4-5. 位置參數(shù)4-6. wh,whois節(jié)點名字查詢4-7. 使用shift5-1. echo一些詭異的變量5-2.

15、 轉(zhuǎn)義符6-1. exit/exit狀態(tài)6-2. 否定一個條件使用!7-1. 什么情況下為真?7-2. 幾個等效命令test,/usr/bin/test,和/usr/bin/7-3. 算數(shù)測試使用( )7-4. test死的鏈接文件7-5. 數(shù)字和字符串比較7-6. 測試字符串是否為null7-7. zmore8-1. 最大公約數(shù)8-2. 使用算術(shù)操作符8-3. 使用&和|進行混合狀態(tài)的test8-4. 數(shù)字常量的處理9-1. $IFS和空白9-2. 時間輸入9-3. 再來一個時間輸入9-4. Timed read9-5. 我是root?9-6. arglist:通過$*和$列出所有的參數(shù)9-

16、7. 不一致的$*和$行為9-8. 當$IFS為空時的$*和$9-9. 下劃線變量9-10. 在一個文本文件的段間插入空行9-11. 利用修改文件名,來轉(zhuǎn)換圖片格式9-12. 模仿getopt命令9-13. 提取字符串的一種可選的方法9-14. 使用參數(shù)替換和error messages9-15. 參數(shù)替換和usagemessages9-16. 變量長度9-17. 參數(shù)替換中的模式匹配9-18. 重命名文件擴展名9-19. 使用模式匹配來分析比較特殊的字符串9-20. 對字符串的前綴或后綴使用匹配模式9-21. 使用declare來指定變量的類型9-22. 間接引用9-23. 傳遞一個間接引用

17、給awk9-24. 產(chǎn)生隨機數(shù)9-25. 從一副撲克牌中取出一張隨機的牌9-26. 兩個指定值之間的隨機數(shù)9-27. 使用隨機數(shù)來搖一個骰子9-28. 重新分配隨機數(shù)種子9-29. 使用awk產(chǎn)生偽隨機數(shù)9-30. C風格的變量處理10-1. 循環(huán)的一個簡單例子10-2. 每個list元素帶兩個參數(shù)的for循環(huán)10-3. 文件信息:對包含在變量中的文件列表進行操作10-4. 在for循環(huán)中操作文件10-5. 在for循環(huán)中省略list10-6. 使用命令替換來產(chǎn)生for循環(huán)的list10-7. 對于二進制文件的一個grep替換10-8. 列出系統(tǒng)上的所有用戶10-9. 在目錄的所有文件中查找源

18、字串10-10. 列出目錄中所有的符號連接文件10-11. 將目錄中的符號連接文件名保存到一個文件中10-12. 一個C風格的for循環(huán)10-13. 在batch mode中使用efax10-14. 簡單的while循環(huán)10-15. 另一個while循環(huán)10-16. 多條件的while循環(huán)10-17. C風格的while循環(huán)10-18. until循環(huán)10-19. 嵌套循環(huán)10-20. break和continue命令在循環(huán)中的效果10-21. 多層循環(huán)的退出10-22. 多層循環(huán)的continue10-23. 在實際的任務中使用continue N10-24. 使用case10-25. 使用

19、case來創(chuàng)建菜單10-26. 使用命令替換來產(chǎn)生case變量10-27. 簡單字符串匹配10-28. 檢查是否是字母輸入10-29. 用select來創(chuàng)建菜單10-30. 用函數(shù)中select結(jié)構(gòu)來創(chuàng)建菜單11-1. 一個fork出多個自己實例的腳本11-2. printf11-3. 使用read,變量分配11-4. 當使用一個不帶變量參數(shù)的read命令時,將會發(fā)生什么?11-5. read命令的多行輸入11-6. 檢測方向鍵11-7. 通過文件重定向來使用read11-8. 管道輸出到read中的問題11-9. 修改當前的工作目錄11-10. 用let命令來作算術(shù)操作.11-11. 顯示e

20、val命令的效果11-12. 強制登出(log-off)11-13. 另一個rot13的版本11-14. 在Perl腳本中使用eval命令來強制變量替換11-15. 使用set來改變腳本的位置參數(shù)11-16. 重新分配位置參數(shù)11-17. Unset一個變量11-18. 使用export命令傳遞一個變量到一個內(nèi)嵌awk的腳本中11-19. 使用getopts命令來讀取傳遞給腳本的選項/參數(shù).11-20. Including一個數(shù)據(jù)文件11-21. 一個沒什么用的,source自身的腳本11-22. exec的效果11-23. 一個exec自身的腳本11-24. 在繼續(xù)處理之前,等待一個進程的結(jié)

21、束11-25. 一個結(jié)束自身的腳本.12-1. 使用ls命令來創(chuàng)建一個燒錄CDR的內(nèi)容列表12-2. Hello or Good-bye12-3. 刪除當前目錄下文件名中包含一些特殊字符(包括空白)的文件.12-4. 通過文件的 inode 號來刪除文件12-5. Logfile: 使用 xargs 來監(jiān)控系統(tǒng) log12-6. 把當前目錄下的文件拷貝到另一個文件中12-7. 通過名字Kill進程12-8. 使用xargs分析單詞出現(xiàn)的頻率12-9. 使用 expr12-10. 使用 date 命令12-11. 分析單詞出現(xiàn)的頻率12-12. 那個文件是腳本?12-13. 產(chǎn)生10進制隨機數(shù)1

22、2-14. 使用 tail 命令來監(jiān)控系統(tǒng)log12-15. 在一個腳本中模仿 grep 的行為12-16. 在1913年的韋氏詞典中查找定義12-17. 檢查列表中單詞的正確性12-18. 轉(zhuǎn)換大寫: 把一個文件的內(nèi)容全部轉(zhuǎn)換為大寫.12-19. 轉(zhuǎn)換小寫: 將當前目錄下的所有文全部轉(zhuǎn)換為小寫.12-20. Du: DOS 到 UNIX 文本文件的轉(zhuǎn)換.12-21. rot13: rot13, 弱智加密.12-22. Generating Crypto-Quote Puzzles12-23. 格式化文件列表.12-24. 使用 column 來格式化目錄列表12-25. nl: 一個自己計算

23、行號的腳本.12-26. manview: 查看格式化的man頁12-27. 使用 cpio 來拷貝一個目錄樹12-28. 解包一個 rpm 歸檔文件 12-29. 從 C 文件中去掉注釋12-30. Exploring /usr/X11R6/bin12-31. 一個改進過的 strings 命令12-32. 在一個腳本中使用 cmp 來比較2個文件.12-33. basename 和 dirname12-34. 檢查文件完整性 12-35. Uudecod 編碼后的文件12-36. 查找濫用的連接來報告垃圾郵件發(fā)送者12-37. 分析一個垃圾郵件域12-38. 獲得一份股票報價12-39.

24、更新 Fedora Core 4 12-40. 使用 ssh12-41. 一個可以mail自己的腳本12-42. 按月償還貸款12-43. 數(shù)制轉(zhuǎn)換12-44. 使用 here document 來調(diào)用 bc12-45. 計算圓周率12-46. 將10進制數(shù)字轉(zhuǎn)換為16進制數(shù)字12-47. 因子分解12-48. 計算直角三角形的斜邊12-49. 使用 seq 來產(chǎn)生循環(huán)參數(shù)12-50. 字母統(tǒng)計12-51. 使用getopt來分析命令行選項12-52. 一個拷貝自身的腳本12-53. 練習dd12-54. 記錄按鍵12-55. 安全的刪除一個文件12-56. 文件名產(chǎn)生器12-57. 將米轉(zhuǎn)換

25、為英里12-58. 使用 m413-1. 設置一個新密碼13-2. 設置一個擦除字符13-3. 關(guān)掉終端對于密碼的echo13-4. 按鍵檢測13-5. Checking a remote server for identd13-6. pidof 幫助殺掉一個進程13-7. 檢查一個CD鏡像13-8. 在一個文件中創(chuàng)建文件系統(tǒng)13-9. 添加一個新的硬盤驅(qū)動器13-10. 使用umask來將輸出文件隱藏起來13-11. killall, 來自于 /etc/rc.d/init.d14-1. 愚蠢的腳本策略14-2. 從循環(huán)的輸出中產(chǎn)生一個變量14-3. 找anagram(回文構(gòu)詞法, 可以將一個

26、有意義的單詞, 變換為1個或多個有意義的單詞, 但是還是原來的子母集合)16-1. 使用exec重定向標準輸入16-2. 使用exec來重定向stdout16-3. 使用exec在同一腳本中重定向stdin和stdout16-4. 避免子shell16-5. while循環(huán)的重定向16-6. 另一種while循環(huán)的重定向16-7. until循環(huán)重定向16-8. for循環(huán)重定向16-9. for循環(huán)重定向 loop (將標準輸入和標準輸出都重定向了)16-10. 重定向if/then測試結(jié)構(gòu)16-11. 用于上面例子的names.data數(shù)據(jù)文件16-12. 記錄日志事件17-1. 廣播:

27、發(fā)送消息給每個登錄上的用戶17-2. 仿造文件: 創(chuàng)建一個兩行的仿造文件17-3. 使用cat的多行消息17-4. 帶有抑制tab功能的多行消息17-5. 使用參數(shù)替換的here document17-6. 上傳一個文件對到Sunsite的incoming目錄17-7. 關(guān)閉參數(shù)替換17-8. 一個產(chǎn)生另外一個腳本的腳本17-9. Here documents與函數(shù)17-10. 匿名 here Document17-11. 注釋掉一段代碼塊 17-12. 一個自文檔化(self-documenting)的腳本17-13. 在一個文件的開頭添加文本20-1. 子shell中的變量作用域20-2.

28、 列出用戶的配置文件20-3. 在子shell里進行串行處理21-1. 在受限的情況下運行腳本23-1. 簡單函數(shù)23-2. 帶著參數(shù)的函數(shù)23-3. 函數(shù)和被傳給腳本的命令行參數(shù)23-4. 傳遞間接引用給函數(shù)23-5. 解除傳遞給函數(shù)的參數(shù)引用23-6. 再次嘗試解除傳遞給函數(shù)的參數(shù)引用23-7. 兩個數(shù)中的最大者23-8. 把數(shù)字轉(zhuǎn)化成羅馬數(shù)字23-9. 測試函數(shù)最大的返回值23-10. 比較兩個大整數(shù)23-11. 用戶名的真實名23-12. 局部變量的可見范圍23-13. 用局部變量來遞歸23-14. 漢諾塔24-1. 腳本中的別名24-2. unalias: 設置和刪除別名25-1.

29、使用與列表(and list)來測試命令行參數(shù)25-2. 用與列表的另一個命令行參數(shù)測試25-3. 或列表和與列表的結(jié)合使用26-1. 簡單的數(shù)組用法26-2. 格式化一首詩26-3. 多種數(shù)組操作26-4. 用于數(shù)組的字符串操作符26-5. 將腳本的內(nèi)容傳給數(shù)組26-6. 一些數(shù)組專用的工具26-7. 關(guān)于空數(shù)組和空數(shù)組元素26-8. 初始化數(shù)組26-9. 復制和連接數(shù)組26-10. 關(guān)于連接數(shù)組的更多信息26-11. 一位老朋友: 冒泡排序26-12. 內(nèi)嵌數(shù)組和間接引用26-13. 復雜數(shù)組應用: 埃拉托色尼素數(shù)篩子26-14. 模擬下推的堆棧26-15. 復雜的數(shù)組應用: 列出一種怪異

30、的數(shù)學序列26-16. 模擬二維數(shù)組,并使它傾斜27-1. 利用/dev/tcp 來檢修故障27-2. 搜索與一個PID相關(guān)的進程27-3. 網(wǎng)絡連接狀態(tài)28-1. 隱藏cookie而不再使用28-2. 用/dev/zero創(chuàng)建一個交換臨時文件28-3. 創(chuàng)建ramdisk29-1. 一個錯誤的腳本29-2. 丟失關(guān)鍵字(keyword)29-3. 另一個錯誤腳本29-4. 用assert測試條件29-5. 捕捉 exit29-6. 在Control-C后清除垃圾29-7. 跟蹤變量29-8. 運行多進程 (在多處理器的機器里)31-1. 數(shù)字和字符串比較是不相等同的31-2. 子SHELL缺

31、陷31-3. 把echo的輸出用管道輸送給read命令33-1. shell 包裝33-2. 稍微復雜一些的shell包裝33-3. 寫到日志文件的shell包裝33-4. 包裝awk的腳本33-5. 另一個包裝awk的腳本33-6. 把Perl嵌入Bash腳本33-7. Bash 和 Perl 腳本聯(lián)合使用33-8. 遞歸調(diào)用自己本身的(無用)腳本33-9. 遞歸調(diào)用自己本身的(有用)腳本33-10. 另一個遞歸調(diào)用自己本身的(有用)腳本33-11. 一個 彩色的 地址資料庫33-12. 畫盒子33-13. 顯示彩色文本33-14. 賽馬 游戲33-15. 返回值技巧33-16. 整型還是s

32、tring?33-17. 傳遞和返回數(shù)組33-18. anagrams游戲33-19. 在shell腳本中調(diào)用的窗口部件34-1. 字符串擴展34-2. 間接變量引用 - 新方法34-3. 使用間接變量引用的簡單數(shù)據(jù)庫應用34-4. 用數(shù)組和其他的小技巧來處理四人隨機打牌A-1. mailformat: Formatting an e-mail messageA-2. rn: A simple-minded file rename utilityA-3. blank-rename: renames filenames containing blanksA-4. encryptedpw: Upl

33、oading to an ftp site, using a locally encrypted passwordA-5. copy-cd: Copying a data CDA-6. Collatz seriesA-7. days-between: Calculate number of days between two datesA-8. Make a dictionaryA-9. Soundex conversionA-10. Game of LifeA-11. Data file for Game of LifeA-12. behead: Removing mail and news

34、message headersA-13. ftpget: Downloading files via ftpA-14. password: Generating random 8-character passwordsA-15. fifo: Making daily backups, using named pipesA-16. Generating prime numbers using the modulo operatorA-17. tree: Displaying a directory treeA-18. string functions: C-like string functio

35、nsA-19. Directory informationA-20. Object-oriented databaseA-21. Library of hash functionsA-22. Colorizing text using hash functionsA-23. Mounting USB keychain storage devicesA-24. Preserving weblogsA-25. Protecting literal stringsA-26. Unprotecting literal stringsA-27. Spammer IdentificationA-28. S

36、pammer HuntA-29. Making wget easier to useA-30. A podcasting scriptA-31. Basics ReviewedA-32. An expanded cd commandC-1. Counting Letter OccurrencesK-1. Sample .bashrc fileL-1. VIEWDATA.BAT: DOS Batch FileL-2. viewdata.sh: Shell Script Conversion of VIEWDATA.BATP-1. Print the server environment第一部分熱

37、身+shell是一個命令解釋器.是介于操作系統(tǒng)kernel與用戶之間的一個絕緣層.準確地說,它也是一一種強力的計算機語言.一個shell程序,被稱為一個腳本,是一種很容易使用的工具,它可以通過將系統(tǒng)調(diào)用,公共程序,工具,和編譯過的二進制程序粘合在一起來建立應用.事實上,所有的UNIX命令和工具再加上公共程序,對于shell腳本來說,都是可調(diào)用的.如果這些你還覺得不夠,那么shell內(nèi)建命令,比如test與循環(huán)結(jié)構(gòu),也會給腳本添加強力的支持和增加靈活性.Shell腳本對于管理系統(tǒng)任務和其它的重復工作的例程來說,表現(xiàn)的非常好,根本不需要那些華而不實的成熟緊湊的程序語言.第1章為什么使用shell編

38、程=沒有程序語言是完美的.甚至沒有一個唯一最好的語言,只有對于特定目的,比較適合和不適合的程序語言.Herbert Mayer對于任何想適當精通一些系統(tǒng)管理知識的人來說,掌握shell腳本知識都是最基本的,即使這些人可能并不打算真正的編寫一些腳本.想一下Linux機器的啟動過程,在這個過程中,必將運行/etc/rc.d目錄下的腳本來存儲系統(tǒng)配置和建立服務.詳細的理解這些啟動腳本對于分析系統(tǒng)的行為是非常重要的,并且有時候可能必須修改它.學習如何編寫shell腳本并不是一件很困難的事,因為腳本可以分為很小的塊,并且相對于shell特性的操作和選項1部分,只需要學習很小的一部分就可以了.語法是簡單并

39、且直觀的,編寫腳本很像是在命令行上把一些相關(guān)命令和工具連接起來,并且只有很少的一部分規(guī)則需要學習.絕大部分腳本第一次就可以正常的工作,而且即使調(diào)試一個長一些的腳本也是很直觀的.一個shell腳本是一個類似于小吃店的(quick and dirty)方法,在你使用原型設計一個復雜的應用的時候.在工程開發(fā)的第一階段,即使從功能中取得很有限的一個子集放到shell腳本中來完成往往都是非常有用的.使用這種方法,程序的結(jié)果可以被測試和嘗試運行,并且在處理使用諸如C/C+,Java或者Perl語言編寫的最終代碼前,主要的缺陷和陷阱往往就被發(fā)現(xiàn)了.Shell腳本遵循典型的UNIX哲學,就是把大的復雜的工程分

40、成小規(guī)模的子任務,并且把這些部件和工具組合起來.許多人認為這種辦法更好一些,至少這種辦法比使用那種高大全的語言更美,更愉悅,更適合解決問題.比如Perl就是這種能干任何事能適合任何人的語言,但是代價就是你需要強迫自己使用這種語言來思考解決問題的辦法.什么時候不使用Shell腳本資源密集型的任務,尤其在需要考慮效率時(比如,排序,hash等等)需要處理大任務的數(shù)學操作,尤其是浮點運算,精確運算,或者復雜的算術(shù)運算(這種情況一般使用C+或FORTRAN來處理)有跨平臺移植需求(一般使用C或Java)復雜的應用,在必須使用結(jié)構(gòu)化編程的時候(需要變量的類型檢查,函數(shù)原型,等等)對于影響系統(tǒng)全局性的關(guān)鍵

41、任務應用。對于安全有很高要求的任務,比如你需要一個健壯的系統(tǒng)來防止入侵,破解,惡意破壞等等.項目由連串的依賴的各個部分組成。需要大規(guī)模的文件操作需要多維數(shù)組的支持需要數(shù)據(jù)結(jié)構(gòu)的支持,比如鏈表或數(shù)等數(shù)據(jù)結(jié)構(gòu)需要產(chǎn)生或操作圖形化界面GUI需要直接操作系統(tǒng)硬件需要I/O或socket接口需要使用庫或者遺留下來的老代碼的接口私人的,閉源的應用(shell腳本把代碼就放在文本文件中,全世界都能看到)如果你的應用符合上邊的任意一條,那么就考慮一下更強大的語言吧-或許是Perl,Tcl,Python,Ruby - 或者是更高層次的編譯語言比如C/C+,或者是Java.即使如此,你會發(fā)現(xiàn),使用shell來原型

42、開發(fā)你的應用,在開發(fā)步驟中也是非常有用的.我們將開始使用Bash,Bash是Bourne-Again shell首字母的縮寫,也是Stephen Bourne的經(jīng)典的Bourne shell的一個雙關(guān)語,(譯者:說實話,我一直搞不清這個雙關(guān)語是什么意思,為什么叫Bourn-Again shell,這其中應該有個什么典故吧,哪位好心,告訴我一下).Bash已經(jīng)成為了所有UNIX中shell腳本的事實上的標準了.同時這本書也覆蓋了絕大部分的其他一些shell的原則,比如Korn Shell,Bash從ksh中繼承了一部分特性,2C Shell和它的變種.(注意:C Shell編程是不被推薦的,因為

43、一些特定的內(nèi)在問題,Tom Christiansen在1993年10月指出了這個問題請在 :/ /Quartz/computer/unix/csh.harmful.gz中查看具體內(nèi)容.)接下來是腳本的一些說明.在展示shell不同的特征之前,它可以減輕一些閱讀書中例子的負擔.本書中的例子腳本,都在盡可能的范圍內(nèi)進行了測試,并且其中的一些將使用在真實的生活中.讀者可以運行這些例子腳本(使用scriptname.sh或者scriptname.bash的形式),3并給這些腳本執(zhí)行權(quán)限(chmod u+rx scriptname),然后執(zhí)行它們,看看發(fā)生了什么.如果存檔的腳本不可用,那么就從本書的HT

44、ML,pdf或者text的發(fā)行版本中把它們拷貝粘貼出來.考慮到這些腳本中的內(nèi)容在我們還沒解釋它之前就被列在這里,可能會影響讀者的理解,這就需要讀者暫時忽略這些內(nèi)容.除非特別注明,本書作者編寫了本書中的絕大部分例子腳本.注意事項:1這些在builtins章節(jié)被引用,這些是shell的內(nèi)部特征.2ksh88的許多特性,甚至是一些ksh93的特性都被合并到Bash中了.3根據(jù)慣例,用戶編寫的Bourne shell腳本應該在腳本的名字后邊加上.sh擴展名.一些系統(tǒng)腳本,比如那些在/etc/rc.d中的腳本,則不遵循這種命名習慣.第2章帶著一個Sha-Bang出發(fā)(Sha-Bang指的是#!)=在一個

45、最簡單的例子中,一個shell腳本其實就是將一堆系統(tǒng)命令列在一個文件中.它的最基本的用處就是,在你每次輸入這些特定順序的命令時可以少敲一些字.Example 2-1 清除:清除/var/log下的log文件#Start Script#1 # Cleanup2 # 當然要使用root身份來運行這個腳本3 4 cd /var/log5 cat /dev/null messages6 cat /dev/null wtmp7 echo Logs cleaned up.#End Script#這根本就沒什么稀奇的, 只不過是命令的堆積, 來讓從console或者xterm中一個一個的輸入命令更方便一些.

46、好處就是把所有命令都放在一個腳本中,不用每次都敲它們.這樣的話,對于特定的應用來說,這個腳本就很容易被修改或定制.Example 2-2 清除:一個改良的清除腳本#Start Script# 1 #!/bin/bash 2 # 一個Bash腳本的正確的開頭部分. 3 4 # Cleanup, 版本 2 5 6 # 當然要使用root身份來運行. 7 # 在此處插入代碼,來打印錯誤消息,并且在不是root身份的時候退出. 8 9 LOG_DIR=/var/log10 # 如果使用變量,當然比把代碼寫死的好.11 cd $LOG_DIR12 13 cat /dev/null messages14

47、cat /dev/null wtmp15 16 17 echo Logs cleaned up.18 19 exit # 這個命令是一種正確并且合適的退出腳本的方法.#End Script#現(xiàn)在,讓我們看一下一個真正意義的腳本.而且我們可以走得更遠.Example 2-3. cleanup:一個增強的和廣義的刪除logfile的腳本#Start Script# 1 #!/bin/bash 2 # 清除, 版本 3 3 4 # Warning: 5 # 6 # 這個腳本有好多特征,這些特征是在后邊章節(jié)進行解釋的,大概是進行到本書的一半的 7 # 時候, 8 # 你就會覺得它沒有什么神秘的了. 9

48、 #10 11 12 13 LOG_DIR=/var/log14 ROOT_UID=0 # $UID為0的時候,用戶才具有根用戶的權(quán)限15 LINES=50 # 默認的保存行數(shù)16 E_XCD=66 # 不能修改目錄?17 E_NOTROOT=67 # 非根用戶將以error退出18 19 20 # 當然要使用根用戶來運行21 if $UID -ne $ROOT_UID 22 then23 echo Must be root to run this script.24 exit $E_NOTROOT25 fi 26 27 if -n $1 28 # 測試是否有命令行參數(shù)(非空).29 then

49、30 lines=$131 else 32 lines=$LINES # 默認,如果不在命令行中指定33 fi 34 35 36 # Stephane Chazelas 建議使用下邊37 #+ 的更好方法來檢測命令行參數(shù).38 #+ 但對于這章來說還是有點超前.39 #40 # E_WRONGARGS=65 # 非數(shù)值參數(shù)(錯誤的參數(shù)格式)41 #42 # case $1 in43 # ) lines=50;44 # *!0-9*) echo Usage: basename $0 file-to-cleanup; exit $E_WRONGARGS;45 # * ) lines=$1;46 #

50、 esac47 #48 #* 直到Loops的章節(jié)才會對上邊的內(nèi)容進行詳細的描述.49 50 51 cd $LOG_DIR52 53 if pwd != $LOG_DIR # 或者if $PWD != $LOG_DIR 54 # 不在 /var/log中?55 then56 echo Cant change to $LOG_DIR.57 exit $E_XCD58 fi # 在處理log file之前,再確認一遍當前目錄是否正確.59 60 # 更有效率的做法是61 #62 # cd /var/log | 63 # echo Cannot change to necessary directo

51、ry. &264 # exit $E_XCD;65 # 66 67 68 69 70 tail -$lines messages mesg.temp # 保存log file消息的最后部分.71 mv mesg.temp messages # 變?yōu)樾碌膌og目錄.72 73 74 # cat /dev/null messages75 #* 不再需要了,使用上邊的方法更安全.76 77 cat /dev/null wtmp # : wtmp 和 wtmp具有相同的作用78 echo Logs cleaned up.79 80 exit 081 # 退出之前返回0,返回0表示成功.82 #End

52、Script#因為你可能希望將系統(tǒng)log全部消滅,這個版本留下了log消息最后的部分.你將不斷地找到新的方法來完善這個腳本,并提高效率.要注意,在每個腳本的開頭都使用#!,這意味著告訴你的系統(tǒng)這個文件的執(zhí)行需要指定一個解釋器.#!實際上是一個2字節(jié)1的魔法數(shù)字,這是指定一個文件類型的特殊標記, 換句話說, 在這種情況下,指的就是一個可執(zhí)行的腳本(鍵入man magic來獲得關(guān)于這個迷人話題的更多詳細信息).在#!之后接著是一個路徑名.這個路徑名指定了一個解釋腳本中命令的程序,這個程序可以是shell,程序語言或者是任意一個通用程序.這個指定的程序從頭開始解釋并且執(zhí)行腳本中的命令(從#!行下邊的

53、一行開始),忽略注釋.2如:1 #!/bin/sh2 #!/bin/bash3 #!/usr/bin/perl4 #!/usr/bin/tcl5 #!/bin/sed -f6 #!/usr/awk -f上邊每一個腳本頭的行都指定了一個不同的命令解釋器,如果是/bin/sh,那么就是默認shell(在Linux系統(tǒng)中默認是Bash).3使用#!/bin/sh,在大多數(shù)商業(yè)發(fā)行的UNIX上,默認是Bourneshell,這將讓你的腳本可以正常的運行在非Linux機器上,雖然這將會犧牲Bash一些獨特的特征.腳本將與POSIX4 的sh標準相一致.注意: #! 后邊給出的路徑名必須是正確的,否則將會

54、出現(xiàn)一個錯誤消息,通常是Command not found,這將是你運行這個腳本時所得到的唯一結(jié)果.當然#!也可以被忽略,不過這樣你的腳本文件就只能是一些命令的集合,不能夠使用shell內(nèi)建的指令了,如果不能使用變量的話,當然這也就失去了腳本編程的意義了.注意:這個例子鼓勵你使用模塊化的方式來編寫腳本,平時也要注意收集一些零碎的代碼,這些零碎的代碼可能用在你將來編寫的腳本中.這樣你就可以通過這些代碼片段來構(gòu)造一個較大的工程用例. 以下邊腳本作為序,來測試腳本被調(diào)用的參數(shù)是否正確.#Start Script# 1 E_WRONG_ARGS=65 2 script_parameters=-a -h

55、 -m -z 3 # -a = all, -h = help, 等等. 4 5 if $# -ne $Number_of_expected_args 6 then 7 echo Usage: basename $0 $script_parameters 8 # basename $0是這個腳本的文件名 9 exit $E_WRONG_ARGS10 fi#End Script#大多數(shù)情況下,你需要編寫一個腳本來執(zhí)行一個特定的任務,在本章中第一個腳本就是一個這樣的例子, 然后你會修改它來完成一個不同的,但比較相似的任務.用變量來代替寫死的常量,就是一個好方法,將重復的代碼放到一個函數(shù)中,也是一種好

56、習慣.2.1 調(diào)用一個腳本編寫完腳本之后,你可以使用sh scriptname,5或者bash scriptname來調(diào)用它.(不推薦使用sh (重定向操作符)結(jié)合使用時,把一個文件截斷到0長度,沒有修改它的權(quán)限.如果文件在之前并不存在,那么就創(chuàng)建它.如:1 : data.xxx#文件data.xxx現(xiàn)在被清空了.23 #與 cat /dev/null data.xxx 的作用相同4 #然而,這不會產(chǎn)生一個新的進程,因為:是一個內(nèi)建命令.具體參見Example 12-14.在和重定向操作符結(jié)合使用時,將不會對想要附加的文件產(chǎn)生任何影響.如果文件不存在,將創(chuàng)建.注意: 這只適用于正規(guī)文件,而不是

57、管道,符號連接,和某些特殊文件.也可能用來作為注釋行,雖然我們不推薦這么做.使用#來注釋的話,將關(guān)閉剩余行的錯誤檢查,所以可以在注釋行中寫任何東西.然而,使用:的話將不會這樣.如:1 : This is a comment thar generates an error,(if $x -eq 3 ).:還用來在/etc/passwd和$PATH變量中用來做分隔符.bash$echo $PATH/usr/local/bin:/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games!取反操作符,將反轉(zhuǎn)退出狀態(tài)結(jié)果,(見Example 6-2).也會反轉(zhuǎn)test操

58、作符的意義.比如修改=為!=.!操作是Bash的一個關(guān)鍵字.在一個不同的上下文中,!也會出現(xiàn)在間接變量引用見Example 9-22.在另一種上下文中,!還能反轉(zhuǎn)bash的history mechanism(見附錄J 歷史命令)需要注意的是,在一個腳本中,history mechanism是被禁用的.*萬能匹配字符,用于文件名匹配(這個東西有個專有名詞叫file globbing),或者是正則表達式中.注意:在正則表達式匹配中的作用和在文件名匹配中的作用是不同的.bash$ echo *abs-book.sgml add-drive.sh agram.sh alias.sh*數(shù)學乘法.*是冪運

59、算.?測試操作.在一個確定的表達式中,用?來測試結(jié)果.()結(jié)構(gòu)可以用來做數(shù)學計算或者是寫c代碼,那?就是c語言的3元操作符的一個.在參數(shù)替換中,?測試一個變量是否被set了.?在file globbing中和在正則表達式中一樣匹配任意的單個字符.$變量替換1 var1=52 var2=23skidoo3 4 echo $var1 # 55 echo $var2 # 23skidoo$在正則表達式中作為行結(jié)束符.$參數(shù)替換,見9.3節(jié).$*,$位置參數(shù)$?退出狀態(tài)變量.$?保存一個命令/一個函數(shù)或者腳本本身的退出狀態(tài).$進程ID變量.這個$變量保存運行腳本進程ID()命令組.如:1 (a=hel

60、lo;echo $a)注意:在()中的命令列表,將作為一個子shell來運行.在()中的變量,由于是在子shell中,所以對于腳本剩下的部分是不可用的.如:1 a=1232 ( a=321; ) 3 4 echo a = $a # a = 1235 # 在圓括號中a變量,更像是一個局部變量.用在數(shù)組初始化,如:1 Array=(element1,element2,element3)xxx,yyy,zzz.大括號擴展,如:1 cat file1,file2,file3 combined_file2 # 把file1,file2,file3連接在一起,并且重定向到combined_file中.3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論