




免費(fèi)預(yù)覽已結(jié)束,剩余598頁可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
目錄+第一部分. 熱身 1. 為什么使用shell編程 2. 帶著一個(gè)Sha-Bang出發(fā)(Sha-Bang指的是#!) 2.1. 調(diào)用一個(gè)腳本 2.2. 初步的練習(xí)第二部分. 基本 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. 嵌套的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)生隨機(jī)整數(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. 基本命令 12.2. 復(fù)雜命令 12.3. 時(shí)間/日期 命令 12.4. 文本處理命令 12.5. 文件與歸檔命令 12.6. 通訊命令 12.7. 終端控制命令 12.8. 數(shù)學(xué)計(jì)算命令 12.9. 混雜命令 13. 系統(tǒng)與管理命令 13.1. 分析一個(gè)系統(tǒng)腳本 14. 命令替換 15. 算術(shù)擴(kuò)展 16. I/O 重定向 16.1. 使用exec 16.2. 代碼塊的重定向 16.3. 應(yīng)用 17. Here Documents 17.1. Here Strings 18. 休息時(shí)間Part 4. 高級 19. 正則表達(dá)式 19.1. 一個(gè)簡要的正則表達(dá)式介紹 19.2. 通配 20. 子shell(Subshells) 21. 受限shell(Restricted Shells) 22. 進(jìn)程替換 23. 函數(shù) 23.1. 復(fù)雜函數(shù)和函數(shù)復(fù)雜性 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. 選項(xiàng) 31. Gotchas 32. 腳本編程風(fēng)格 32.1. 非官方的Shell腳本風(fēng)格 33. 雜項(xiàng) 33.1. 交互式和非交互式的shells和腳本 33.2. Shell 包裝 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下進(jìn)行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. CreditsBibliographyA. 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 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è)標(biāo)識符30-1. Bash 選項(xiàng)33-1. 轉(zhuǎn)義序列中數(shù)值和彩色的對應(yīng)B-1. Special Shell VariablesB-2. TEST Operators: Binary ComparisonB-3. 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 equivalentsN-1. Revision History例子清單:2-1. 清除:清除/var/log下的log文件2-2. 清除:一個(gè)改良的清除腳本2-3. cleanup:一個(gè)增強(qiáng)的和廣義的刪除logfile的腳本3-1. 代碼塊和I/O重定向3-2. 將一個(gè)代碼塊的結(jié)果保存到文件3-3. 在后臺運(yùn)行一個(gè)循環(huán)3-4. 備份最后一天所有修改的文件.4-1. 變量賦值和替換4-2. 一般的變量賦值4-3. 變量賦值,一般的和比較特殊的4-4. 整型還是string?4-5. 位置參數(shù)4-6. wh,whois節(jié)點(diǎn)名字查詢4-7. 使用shift5-1. echo一些詭異的變量5-2. 轉(zhuǎn)義符6-1. exit/exit狀態(tài)6-2. 否定一個(gè)條件使用!7-1. 什么情況下為真?7-2. 幾個(gè)等效命令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. 使用&和|進(jìn)行混合狀態(tài)的test8-4. 數(shù)字常量的處理9-1. $IFS和空白9-2. 時(shí)間輸入9-3. 再來一個(gè)時(shí)間輸入9-4. Timed read9-5. 我是root?9-6. arglist:通過$*和$列出所有的參數(shù)9-7. 不一致的$*和$行為9-8. 當(dāng)$IFS為空時(shí)的$*和$9-9. 下劃線變量9-10. 在一個(gè)文本文件的段間插入空行9-11. 利用修改文件名,來轉(zhuǎn)換圖片格式9-12. 模仿getopt命令9-13. 提取字符串的一種可選的方法9-14. 使用參數(shù)替換和error messages9-15. 參數(shù)替換和usagemessages9-16. 變量長度9-17. 參數(shù)替換中的模式匹配9-18. 重命名文件擴(kuò)展名9-19. 使用模式匹配來分析比較特殊的字符串9-20. 對字符串的前綴或后綴使用匹配模式9-21. 使用declare來指定變量的類型9-22. 間接引用9-23. 傳遞一個(gè)間接引用給awk9-24. 產(chǎn)生隨機(jī)數(shù)9-25. 從一副撲克牌中取出一張隨機(jī)的牌9-26. 兩個(gè)指定值之間的隨機(jī)數(shù)9-27. 使用隨機(jī)數(shù)來搖一個(gè)骰子9-28. 重新分配隨機(jī)數(shù)種子9-29. 使用awk產(chǎn)生偽隨機(jī)數(shù)9-30. C風(fēng)格的變量處理10-1. 循環(huán)的一個(gè)簡單例子10-2. 每個(gè)list元素帶兩個(gè)參數(shù)的for循環(huán)10-3. 文件信息:對包含在變量中的文件列表進(jìn)行操作10-4. 在for循環(huán)中操作文件10-5. 在for循環(huán)中省略list10-6. 使用命令替換來產(chǎn)生for循環(huán)的list10-7. 對于二進(jìn)制文件的一個(gè)grep替換10-8. 列出系統(tǒng)上的所有用戶10-9. 在目錄的所有文件中查找源字串10-10. 列出目錄中所有的符號連接文件10-11. 將目錄中的符號連接文件名保存到一個(gè)文件中10-12. 一個(gè)C風(fēng)格的for循環(huán)10-13. 在batch mode中使用efax10-14. 簡單的while循環(huán)10-15. 另一個(gè)while循環(huán)10-16. 多條件的while循環(huán)10-17. C風(fēng)格的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. 在實(shí)際的任務(wù)中使用continue N10-24. 使用case10-25. 使用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. 一個(gè)fork出多個(gè)自己實(shí)例的腳本11-2. printf11-3. 使用read,變量分配11-4. 當(dāng)使用一個(gè)不帶變量參數(shù)的read命令時(shí),將會發(fā)生什么?11-5. read命令的多行輸入11-6. 檢測方向鍵11-7. 通過文件重定向來使用read11-8. 管道輸出到read中的問題11-9. 修改當(dāng)前的工作目錄11-10. 用let命令來作算術(shù)操作.11-11. 顯示eval命令的效果11-12. 強(qiáng)制登出(log-off)11-13. 另一個(gè)rot13的版本11-14. 在Perl腳本中使用eval命令來強(qiáng)制變量替換11-15. 使用set來改變腳本的位置參數(shù)11-16. 重新分配位置參數(shù)11-17. Unset一個(gè)變量11-18. 使用export命令傳遞一個(gè)變量到一個(gè)內(nèi)嵌awk的腳本中11-19. 使用getopts命令來讀取傳遞給腳本的選項(xiàng)/參數(shù).11-20. Including一個(gè)數(shù)據(jù)文件11-21. 一個(gè)沒什么用的,source自身的腳本11-22. exec的效果11-23. 一個(gè)exec自身的腳本11-24. 在繼續(xù)處理之前,等待一個(gè)進(jìn)程的結(jié)束11-25. 一個(gè)結(jié)束自身的腳本.12-1. 使用ls命令來創(chuàng)建一個(gè)燒錄CDR的內(nèi)容列表12-2. Hello or Good-bye12-3. 刪除當(dāng)前目錄下文件名中包含一些特殊字符(包括空白)的文件.12-4. 通過文件的 inode 號來刪除文件12-5. Logfile: 使用 xargs 來監(jiān)控系統(tǒng) log12-6. 把當(dāng)前目錄下的文件拷貝到另一個(gè)文件中12-7. 通過名字Kill進(jìn)程12-8. 使用xargs分析單詞出現(xiàn)的頻率12-9. 使用 expr12-10. 使用 date 命令12-11. 分析單詞出現(xiàn)的頻率12-12. 那個(gè)文件是腳本?12-13. 產(chǎn)生10進(jìn)制隨機(jī)數(shù)12-14. 使用 tail 命令來監(jiān)控系統(tǒng)log12-15. 在一個(gè)腳本中模仿 grep 的行為12-16. 在1913年的韋氏詞典中查找定義12-17. 檢查列表中單詞的正確性12-18. 轉(zhuǎn)換大寫: 把一個(gè)文件的內(nèi)容全部轉(zhuǎn)換為大寫.12-19. 轉(zhuǎn)換小寫: 將當(dāng)前目錄下的所有文全部轉(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: 一個(gè)自己計(jì)算行號的腳本.12-26. manview: 查看格式化的man頁12-27. 使用 cpio 來拷貝一個(gè)目錄樹12-28. 解包一個(gè) rpm 歸檔文件 12-29. 從 C 文件中去掉注釋12-30. Exploring /usr/X11R6/bin12-31. 一個(gè)改進(jìn)過的 strings 命令12-32. 在一個(gè)腳本中使用 cmp 來比較2個(gè)文件.12-33. basename 和 dirname12-34. 檢查文件完整性 12-35. Uudecod 編碼后的文件12-36. 查找濫用的連接來報(bào)告垃圾郵件發(fā)送者12-37. 分析一個(gè)垃圾郵件域12-38. 獲得一份股票報(bào)價(jià)12-39. 更新 Fedora Core 4 12-40. 使用 ssh12-41. 一個(gè)可以mail自己的腳本12-42. 按月償還貸款12-43. 數(shù)制轉(zhuǎn)換12-44. 使用 here document 來調(diào)用 bc12-45. 計(jì)算圓周率12-46. 將10進(jìn)制數(shù)字轉(zhuǎn)換為16進(jìn)制數(shù)字12-47. 因子分解12-48. 計(jì)算直角三角形的斜邊12-49. 使用 seq 來產(chǎn)生循環(huán)參數(shù)12-50. 字母統(tǒng)計(jì)12-51. 使用getopt來分析命令行選項(xiàng)12-52. 一個(gè)拷貝自身的腳本12-53. 練習(xí)dd12-54. 記錄按鍵12-55. 安全的刪除一個(gè)文件12-56. 文件名產(chǎn)生器12-57. 將米轉(zhuǎn)換為英里12-58. 使用 m413-1. 設(shè)置一個(gè)新密碼13-2. 設(shè)置一個(gè)擦除字符13-3. 關(guān)掉終端對于密碼的echo13-4. 按鍵檢測13-5. Checking a remote server for identd13-6. pidof 幫助殺掉一個(gè)進(jìn)程13-7. 檢查一個(gè)CD鏡像13-8. 在一個(gè)文件中創(chuàng)建文件系統(tǒng)13-9. 添加一個(gè)新的硬盤驅(qū)動器13-10. 使用umask來將輸出文件隱藏起來13-11. killall, 來自于 /etc/rc.d/init.d14-1. 愚蠢的腳本策略14-2. 從循環(huán)的輸出中產(chǎn)生一個(gè)變量14-3. 找anagram(回文構(gòu)詞法, 可以將一個(gè)有意義的單詞, 變換為1個(gè)或多個(gè)有意義的單詞, 但是還是原來的子母集合)16-1. 使用exec重定向標(biāo)準(zhǔn)輸入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 (將標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出都重定向了)16-10. 重定向if/then測試結(jié)構(gòu)16-11. 用于上面例子的names.data數(shù)據(jù)文件16-12. 記錄日志事件17-1. 廣播: 發(fā)送消息給每個(gè)登錄上的用戶17-2. 仿造文件: 創(chuàng)建一個(gè)兩行的仿造文件17-3. 使用cat的多行消息17-4. 帶有抑制tab功能的多行消息17-5. 使用參數(shù)替換的here document17-6. 上傳一個(gè)文件對到Sunsite的incoming目錄17-7. 關(guān)閉參數(shù)替換17-8. 一個(gè)產(chǎn)生另外一個(gè)腳本的腳本17-9. Here documents與函數(shù)17-10. 匿名 here Document17-11. 注釋掉一段代碼塊 17-12. 一個(gè)自文檔化(self-documenting)的腳本17-13. 在一個(gè)文件的開頭添加文本20-1. 子shell中的變量作用域20-2. 列出用戶的配置文件20-3. 在子shell里進(jìn)行串行處理21-1. 在受限的情況下運(yùn)行腳本23-1. 簡單函數(shù)23-2. 帶著參數(shù)的函數(shù)23-3. 函數(shù)和被傳給腳本的命令行參數(shù)23-4. 傳遞間接引用給函數(shù)23-5. 解除傳遞給函數(shù)的參數(shù)引用23-6. 再次嘗試解除傳遞給函數(shù)的參數(shù)引用23-7. 兩個(gè)數(shù)中的最大者23-8. 把數(shù)字轉(zhuǎn)化成羅馬數(shù)字23-9. 測試函數(shù)最大的返回值23-10. 比較兩個(gè)大整數(shù)23-11. 用戶名的真實(shí)名23-12. 局部變量的可見范圍23-13. 用局部變量來遞歸23-14. 漢諾塔24-1. 腳本中的別名24-2. unalias: 設(shè)置和刪除別名25-1. 使用與列表(and list)來測試命令行參數(shù)25-2. 用與列表的另一個(gè)命令行參數(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. 復(fù)制和連接數(shù)組26-10. 關(guān)于連接數(shù)組的更多信息26-11. 一位老朋友: 冒泡排序26-12. 內(nèi)嵌數(shù)組和間接引用26-13. 復(fù)雜數(shù)組應(yīng)用: 埃拉托色尼素?cái)?shù)篩子26-14. 模擬下推的堆棧26-15. 復(fù)雜的數(shù)組應(yīng)用: 列出一種怪異的數(shù)學(xué)序列26-16. 模擬二維數(shù)組,并使它傾斜27-1. 利用/dev/tcp 來檢修故障27-2. 搜索與一個(gè)PID相關(guān)的進(jìn)程27-3. 網(wǎng)絡(luò)連接狀態(tài)28-1. 隱藏cookie而不再使用28-2. 用/dev/zero創(chuàng)建一個(gè)交換臨時(shí)文件28-3. 創(chuàng)建ramdisk29-1. 一個(gè)錯誤的腳本29-2. 丟失關(guān)鍵字(keyword)29-3. 另一個(gè)錯誤腳本29-4. 用assert測試條件29-5. 捕捉 exit29-6. 在Control-C后清除垃圾29-7. 跟蹤變量29-8. 運(yùn)行多進(jìn)程 (在多處理器的機(jī)器里)31-1. 數(shù)字和字符串比較是不相等同的31-2. 子SHELL缺陷31-3. 把echo的輸出用管道輸送給read命令33-1. shell 包裝33-2. 稍微復(fù)雜一些的shell包裝33-3. 寫到日志文件的shell包裝33-4. 包裝awk的腳本33-5. 另一個(gè)包裝awk的腳本33-6. 把Perl嵌入Bash腳本33-7. Bash 和 Perl 腳本聯(lián)合使用33-8. 遞歸調(diào)用自己本身的(無用)腳本33-9. 遞歸調(diào)用自己本身的(有用)腳本33-10. 另一個(gè)遞歸調(diào)用自己本身的(有用)腳本33-11. 一個(gè) 彩色的 地址資料庫33-12. 畫盒子33-13. 顯示彩色文本33-14. 賽馬 游戲33-15. 返回值技巧33-16. 整型還是string?33-17. 傳遞和返回?cái)?shù)組33-18. anagrams游戲33-19. 在shell腳本中調(diào)用的窗口部件34-1. 字符串?dāng)U展34-2. 間接變量引用 - 新方法34-3. 使用間接變量引用的簡單數(shù)據(jù)庫應(yīng)用34-4. 用數(shù)組和其他的小技巧來處理四人隨機(jī)打牌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: Uploading 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 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 functionsA-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. Spammer 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第一部分熱身+shell是一個(gè)命令解釋器.是介于操作系統(tǒng)kernel與用戶之間的一個(gè)絕緣層.準(zhǔn)確地說,它也是一一種強(qiáng)力的計(jì)算機(jī)語言.一個(gè)shell程序,被稱為一個(gè)腳本,是一種很容易使用的工具,它可以通過將系統(tǒng)調(diào)用,公共程序,工具,和編譯過的二進(jìn)制程序粘合在一起來建立應(yīng)用.事實(shí)上,所有的UNIX命令和工具再加上公共程序,對于shell腳本來說,都是可調(diào)用的.如果這些你還覺得不夠,那么shell內(nèi)建命令,比如test與循環(huán)結(jié)構(gòu),也會給腳本添加強(qiáng)力的支持和增加靈活性.Shell腳本對于管理系統(tǒng)任務(wù)和其它的重復(fù)工作的例程來說,表現(xiàn)的非常好,根本不需要那些華而不實(shí)的成熟緊湊的程序語言.第1章為什么使用shell編程=沒有程序語言是完美的.甚至沒有一個(gè)唯一最好的語言,只有對于特定目的,比較適合和不適合的程序語言.Herbert Mayer對于任何想適當(dāng)精通一些系統(tǒng)管理知識的人來說,掌握shell腳本知識都是最基本的,即使這些人可能并不打算真正的編寫一些腳本.想一下Linux機(jī)器的啟動過程,在這個(gè)過程中,必將運(yùn)行/etc/rc.d目錄下的腳本來存儲系統(tǒng)配置和建立服務(wù).詳細(xì)的理解這些啟動腳本對于分析系統(tǒng)的行為是非常重要的,并且有時(shí)候可能必須修改它.學(xué)習(xí)如何編寫shell腳本并不是一件很困難的事,因?yàn)槟_本可以分為很小的塊,并且相對于shell特性的操作和選項(xiàng)1部分,只需要學(xué)習(xí)很小的一部分就可以了.語法是簡單并且直觀的,編寫腳本很像是在命令行上把一些相關(guān)命令和工具連接起來,并且只有很少的一部分規(guī)則需要學(xué)習(xí).絕大部分腳本第一次就可以正常的工作,而且即使調(diào)試一個(gè)長一些的腳本也是很直觀的.一個(gè)shell腳本是一個(gè)類似于小吃店的(quick and dirty)方法,在你使用原型設(shè)計(jì)一個(gè)復(fù)雜的應(yīng)用的時(shí)候.在工程開發(fā)的第一階段,即使從功能中取得很有限的一個(gè)子集放到shell腳本中來完成往往都是非常有用的.使用這種方法,程序的結(jié)果可以被測試和嘗試運(yùn)行,并且在處理使用諸如C/C+,Java或者Perl語言編寫的最終代碼前,主要的缺陷和陷阱往往就被發(fā)現(xiàn)了.Shell腳本遵循典型的UNIX哲學(xué),就是把大的復(fù)雜的工程分成小規(guī)模的子任務(wù),并且把這些部件和工具組合起來.許多人認(rèn)為這種辦法更好一些,至少這種辦法比使用那種高大全的語言更美,更愉悅,更適合解決問題.比如Perl就是這種能干任何事能適合任何人的語言,但是代價(jià)就是你需要強(qiáng)迫自己使用這種語言來思考解決問題的辦法.什么時(shí)候不使用Shell腳本資源密集型的任務(wù),尤其在需要考慮效率時(shí)(比如,排序,hash等等)需要處理大任務(wù)的數(shù)學(xué)操作,尤其是浮點(diǎn)運(yùn)算,精確運(yùn)算,或者復(fù)雜的算術(shù)運(yùn)算(這種情況一般使用C+或FORTRAN來處理)有跨平臺移植需求(一般使用C或Java)復(fù)雜的應(yīng)用,在必須使用結(jié)構(gòu)化編程的時(shí)候(需要變量的類型檢查,函數(shù)原型,等等)對于影響系統(tǒng)全局性的關(guān)鍵任務(wù)應(yīng)用。對于安全有很高要求的任務(wù),比如你需要一個(gè)健壯的系統(tǒng)來防止入侵,破解,惡意破壞等等.項(xiàng)目由連串的依賴的各個(gè)部分組成。需要大規(guī)模的文件操作需要多維數(shù)組的支持需要數(shù)據(jù)結(jié)構(gòu)的支持,比如鏈表或數(shù)等數(shù)據(jù)結(jié)構(gòu)需要產(chǎn)生或操作圖形化界面GUI需要直接操作系統(tǒng)硬件需要I/O或socket接口需要使用庫或者遺留下來的老代碼的接口私人的,閉源的應(yīng)用(shell腳本把代碼就放在文本文件中,全世界都能看到)如果你的應(yīng)用符合上邊的任意一條,那么就考慮一下更強(qiáng)大的語言吧-或許是Perl,Tcl,Python,Ruby - 或者是更高層次的編譯語言比如C/C+,或者是Java.即使如此,你會發(fā)現(xiàn),使用shell來原型開發(fā)你的應(yīng)用,在開發(fā)步驟中也是非常有用的.我們將開始使用Bash,Bash是Bourne-Again shell首字母的縮寫,也是Stephen Bourne的經(jīng)典的Bourne shell的一個(gè)雙關(guān)語,(譯者:說實(shí)話,我一直搞不清這個(gè)雙關(guān)語是什么意思,為什么叫Bourn-Again shell,這其中應(yīng)該有個(gè)什么典故吧,哪位好心,告訴我一下).Bash已經(jīng)成為了所有UNIX中shell腳本的事實(shí)上的標(biāo)準(zhǔn)了.同時(shí)這本書也覆蓋了絕大部分的其他一些shell的原則,比如Korn Shell,Bash從ksh中繼承了一部分特性,2C Shell和它的變種.(注意:C Shell編程是不被推薦的,因?yàn)橐恍┨囟ǖ膬?nèi)在問題,Tom Christiansen在1993年10月指出了這個(gè)問題請?jiān)?Quartz/computer/unix/csh.harmful.gz中查看具體內(nèi)容.)接下來是腳本的一些說明.在展示shell不同的特征之前,它可以減輕一些閱讀書中例子的負(fù)擔(dān).本書中的例子腳本,都在盡可能的范圍內(nèi)進(jìn)行了測試,并且其中的一些將使用在真實(shí)的生活中.讀者可以運(yùn)行這些例子腳本(使用scriptname.sh或者scriptname.bash的形式),3并給這些腳本執(zhí)行權(quán)限(chmod u+rx scriptname),然后執(zhí)行它們,看看發(fā)生了什么.如果存檔的腳本不可用,那么就從本書的HTML,pdf或者text的發(fā)行版本中把它們拷貝粘貼出來.考慮到這些腳本中的內(nèi)容在我們還沒解釋它之前就被列在這里,可能會影響讀者的理解,這就需要讀者暫時(shí)忽略這些內(nèi)容.除非特別注明,本書作者編寫了本書中的絕大部分例子腳本.注意事項(xiàng):1這些在builtins章節(jié)被引用,這些是shell的內(nèi)部特征.2ksh88的許多特性,甚至是一些ksh93的特性都被合并到Bash中了.3根據(jù)慣例,用戶編寫的Bourne shell腳本應(yīng)該在腳本的名字后邊加上.sh擴(kuò)展名.一些系統(tǒng)腳本,比如那些在/etc/rc.d中的腳本,則不遵循這種命名習(xí)慣.第2章帶著一個(gè)Sha-Bang出發(fā)(Sha-Bang指的是#!)=在一個(gè)最簡單的例子中,一個(gè)shell腳本其實(shí)就是將一堆系統(tǒng)命令列在一個(gè)文件中.它的最基本的用處就是,在你每次輸入這些特定順序的命令時(shí)可以少敲一些字.Example 2-1 清除:清除/var/log下的log文件#Start Script#1 # Cleanup2 # 當(dāng)然要使用root身份來運(yùn)行這個(gè)腳本3 4 cd /var/log5 cat /dev/null messages6 cat /dev/null wtmp7 echo Logs cleaned up.#End Script#這根本就沒什么稀奇的, 只不過是命令的堆積, 來讓從console或者xterm中一個(gè)一個(gè)的輸入命令更方便一些.好處就是把所有命令都放在一個(gè)腳本中,不用每次都敲它們.這樣的話,對于特定的應(yīng)用來說,這個(gè)腳本就很容易被修改或定制.Example 2-2 清除:一個(gè)改良的清除腳本#Start Script# 1 #!/bin/bash 2 # 一個(gè)Bash腳本的正確的開頭部分. 3 4 # Cleanup, 版本 2 5 6 # 當(dāng)然要使用root身份來運(yùn)行. 7 # 在此處插入代碼,來打印錯誤消息,并且在不是root身份的時(shí)候退出. 8 9 LOG_DIR=/var/log10 # 如果使用變量,當(dāng)然比把代碼寫死的好.11 cd $LOG_DIR12 13 cat /dev/null messages14 cat /dev/null wtmp15 16 17 echo Logs cleaned up.18 19 exit # 這個(gè)命令是一種正確并且合適的退出腳本的方法.#End Script#現(xiàn)在,讓我們看一下一個(gè)真正意義的腳本.而且我們可以走得更遠(yuǎn).Example 2-3. cleanup:一個(gè)增強(qiáng)的和廣義的刪除logfile的腳本#Start Script# 1 #!/bin/bash 2 # 清除, 版本 3 3 4 # Warning: 5 # - 6 # 這個(gè)腳本有好多特征,這些特征是在后邊章節(jié)進(jìn)行解釋的,大概是進(jìn)行到本書的一半的 7 # 時(shí)候, 8 # 你就會覺得它沒有什么神秘的了. 9 #10 11 12 13 LOG_DIR=/var/log14 ROOT_UID=0 # $UID為0的時(shí)候,用戶才具有根用戶的權(quán)限15 LINES=50 # 默認(rèn)的保存行數(shù)16 E_XCD=66 # 不能修改目錄?17 E_NOTROOT=67 # 非根用戶將以error退出18 19 20 # 當(dāng)然要使用根用戶來運(yùn)行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 then30 lines=$131 else 32 lines=$LINES # 默認(rèn),如果不在命令行中指定33 fi 34 35 36 # Stephane Chazelas 建議使用下邊37 #+ 的更好方法來檢測命令行參數(shù).38 #+ 但對于這章來說還是有點(diǎn)超前.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 # esac47 #48 #* 直到Loops的章節(jié)才會對上邊的內(nèi)容進(jìn)行詳細(xì)的描述.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之前,再確認(rèn)一遍當(dāng)前目錄是否正確.59 60 # 更有效率的做法是61 #62 # cd /var/log | 63 # echo Cannot change to necessary directory. &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 Script#因?yàn)槟憧赡芟M麑⑾到y(tǒng)log全部消滅,這個(gè)版本留下了log消息最后的部分.你將不斷地找到新的方法來完善這個(gè)腳本,并提高效率.要注意,在每個(gè)腳本的開頭都使用#!,這意味著告訴你的系統(tǒng)這個(gè)文件的執(zhí)行需要指定一個(gè)解釋器.#!實(shí)際上是一個(gè)2字節(jié)1的魔法數(shù)字,這是指定一個(gè)文件類型的特殊標(biāo)記, 換句話說, 在這種情況下,指的就是一個(gè)可執(zhí)行的腳本(鍵入man magic來獲得關(guān)于這個(gè)迷人話題的更多詳細(xì)信息).在#!之后接著是一個(gè)路徑名.這個(gè)路徑名指定了一個(gè)解釋腳本中命令的程序,這個(gè)程序可以是shell,程序語言或者是任意一個(gè)通用程序.這個(gè)指定的程序從頭開始解釋并且執(zhí)行腳本中的命令(從#!行下邊的一行開始),忽略注釋.2如:1 #!/bin/sh2 #!/bin/bash3 #!/usr/bin/perl4 #!/usr/bin/tcl5 #!/bin/sed -f6 #!/usr/awk -f上邊每一個(gè)腳本頭的行都指定了一個(gè)不同的命令解釋器,如果是/bin/sh,那么就是默認(rèn)shell(在Linux系統(tǒng)中默認(rèn)是Bash).3使用#!/bin/sh,在大多數(shù)商業(yè)發(fā)行的UNIX上,默認(rèn)是Bourneshell,這將讓你的腳本可以正常的運(yùn)行在非Linux機(jī)器上,雖然這將會犧牲Bash一些獨(dú)特的特征.腳本將與POSIX4 的sh標(biāo)準(zhǔn)相一致.注意: #! 后邊給出的路徑名必須是正確的,否則將會出現(xiàn)一個(gè)錯誤消息,通常是Command not found,這將是你運(yùn)行這個(gè)腳本時(shí)所得到的唯一結(jié)果.當(dāng)然#!也可以被忽略,不過這樣你的腳本文件就只能是一些命令的集合,不能夠使用shell內(nèi)建的指令了,如果不能使用變量的話,當(dāng)然這也就失去了腳本編程的意義了.注意:這個(gè)例子鼓勵你使用模塊化的方式來編寫腳本,平時(shí)也要注意收集一些零碎的代碼,這些零碎的代碼可能用在你將來編寫的腳本中.這樣你就可以通過這些代碼片段來構(gòu)造一個(gè)較大的工程用例. 以下邊腳本作為序,來測試腳本被調(diào)用的參數(shù)是否正確.#Start Script# 1 E_WRONG_ARGS=65 2 script_parameters=-a -h -m -z 3 # -a = all, -h = help, 等等. 4 5 if $# -ne $Number_of_expected_args 6 then 7 echo Usage: basename $0 $script_parameters
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車制造業(yè)2025年供應(yīng)鏈風(fēng)險(xiǎn)管理數(shù)字化解決方案報(bào)告
- 2025屆廣東省梅州市梅江實(shí)驗(yàn)中學(xué)英語八年級第二學(xué)期期末質(zhì)量檢測模擬試題含答案
- 2025年元宇宙社交平臺虛擬現(xiàn)實(shí)社交平臺運(yùn)營模式研究報(bào)告
- 城市污水處理廠智能化升級改造中的智能化水質(zhì)處理技術(shù)研究報(bào)告
- 2025年醫(yī)院電子病歷系統(tǒng)在醫(yī)院信息化建設(shè)中的邊緣計(jì)算應(yīng)用報(bào)告
- 2025年醫(yī)藥行業(yè)未來趨勢:仿制藥一致性評價(jià)下的醫(yī)藥電商發(fā)展報(bào)告
- 2025年醫(yī)藥企業(yè)研發(fā)外包(CRO)與企業(yè)核心競爭力提升報(bào)告
- 能源行業(yè)2025年儲能技術(shù)多元化儲能電池材料研發(fā)與創(chuàng)新報(bào)告
- 禮儀培訓(xùn)課件標(biāo)題
- 安全轉(zhuǎn)運(yùn)試題及答案
- 七年級下冊英語語法填空專項(xiàng)訓(xùn)練100題含答案5篇
- 衛(wèi)生院“服務(wù)基層行”支撐材料(3.7放射防護(hù)管理)
- 2024年xx中學(xué)學(xué)生校服選用采購實(shí)施方案
- 英語閱讀5篇(難度較高)
- 煤礦防滅火細(xì)則
- DL∕T 2622-2023 1000kV高壓并聯(lián)電抗器局部放電現(xiàn)場測量技術(shù)導(dǎo)則
- 農(nóng)村社區(qū)基礎(chǔ)設(shè)施和公共服務(wù)建設(shè)項(xiàng)目可行性研究報(bào)告
- ISO9001-ISO14001-ISO45001三體系內(nèi)部審核檢查表
- JT-T-1270.3-2019公路橋梁梳齒板伸縮裝置第3部分:整體錨固式伸縮裝置
- 【8物(人教版)】淮北市二中聯(lián)考2023-2024學(xué)年八年級下學(xué)期期末考試物理試題
- 2024年05月山東濰坊市中心血站招考聘用3人筆試歷年高頻考點(diǎn)(難、易錯點(diǎn))附帶答案詳解
評論
0/150
提交評論