?? abs_guide_cn.txt
字號:
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. Unset一個變量
11-18. 使用export命令傳遞一個變量到一個內嵌awk的腳本中
11-19. 使用getopts命令來讀取傳遞給腳本的選項/參數.
11-20. "Including"一個數據文件
11-21. 一個沒什么用的,source自身的腳本
11-22. exec的效果
11-23. 一個exec自身的腳本
11-24. 在繼續處理之前,等待一個進程的結束
11-25. 一個結束自身的腳本.
12-1. 使用ls命令來創建一個燒錄CDR的內容列表
12-2. Hello or 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. Generating "Crypto-Quote" Puzzles
12-23. 格式化文件列表.
12-24. 使用 column 來格式化目錄列表
12-25. nl: 一個自己計算行號的腳本.
12-26. manview: 查看格式化的man頁
12-27. 使用 cpio 來拷貝一個目錄樹
12-28. 解包一個 rpm 歸檔文件
12-29. 從 C 文件中去掉注釋
12-30. Exploring /usr/X11R6/bin
12-31. 一個"改進過"的 strings 命令
12-32. 在一個腳本中使用 cmp 來比較2個文件.
12-33. basename 和 dirname
12-34. 檢查文件完整性
12-35. Uudecod 編碼后的文件
12-36. 查找濫用的連接來報告垃圾郵件發送者
12-37. 分析一個垃圾郵件域
12-38. 獲得一份股票報價
12-39. 更新 Fedora Core 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. Checking a remote server for identd<rojy bug>
13-6. pidof 幫助殺掉一個進程
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重定向標準輸入
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循環重定向 loop (將標準輸入和標準輸出都重定向了)
16-10. 重定向if/then測試結構
16-11. 用于上面例子的"names.data"數據文件
16-12. 記錄日志事件
17-1. 廣播: 發送消息給每個登錄上的用戶
17-2. 仿造文件: 創建一個兩行的仿造文件
17-3. 使用cat的多行消息
17-4. 帶有抑制tab功能的多行消息
17-5. 使用參數替換的here document
17-6. 上傳一個文件對到"Sunsite"的incoming目錄
17-7. 關閉參數替換
17-8. 一個產生另外一個腳本的腳本
17-9. Here documents與函數
17-10. "匿名" here Document
17-11. 注釋掉一段代碼塊
17-12. 一個自文檔化(self-documenting)的腳本
17-13. 在一個文件的開頭添加文本
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. 用戶名的真實名
23-12. 局部變量的可見范圍
23-13. 用局部變量來遞歸
23-14. 漢諾塔
24-1. 腳本中的別名
24-2. unalias: 設置和刪除別名
25-1. 使用"與列表(and list)"來測試命令行參數
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. 丟失關鍵字(keyword)
29-3. 另一個錯誤腳本
29-4. 用"assert"測試條件
29-5. 捕捉 exit
29-6. 在Control-C后清除垃圾
29-7. 跟蹤變量
29-8. 運行多進程 (在多處理器的機器里)
31-1. 數字和字符串比較是不相等同的
31-2. 子SHELL缺陷
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 腳本聯合使用
33-8. 遞歸調用自己本身的(無用)腳本
33-9. 遞歸調用自己本身的(有用)腳本
33-10. 另一個遞歸調用自己本身的(有用)腳本
33-11. 一個 "彩色的" 地址資料庫
33-12. 畫盒子
33-13. 顯示彩色文本
33-14. "賽馬" 游戲
33-15. 返回值技巧
33-16. 整型還是string?
33-17. 傳遞和返回數組
33-18. anagrams游戲
33-19. 在shell腳本中調用的窗口部件
34-1. 字符串擴展
34-2. 間接變量引用 - 新方法
34-3. 使用間接變量引用的簡單數據庫應用
34-4. 用數組和其他的小技巧來處理四人隨機打牌
A-1. mailformat: Formatting an e-mail message
A-2. rn: A simple-minded file rename utility
A-3. blank-rename: renames filenames containing blanks
A-4. encryptedpw: Uploading to an ftp site, using a locally encrypted password
A-5. copy-cd: Copying a data CD
A-6. Collatz series
A-7. days-between: Calculate number of days between two dates
A-8. Make a "dictionary"
A-9. Soundex conversion
A-10. "Game of Life"
A-11. Data file for "Game of Life"
A-12. behead: Removing mail and news message headers
A-13. ftpget: Downloading files via ftp
A-14. password: Generating random 8-character passwords
A-15. fifo: Making daily backups, using named pipes
A-16. Generating prime numbers using the modulo operator
A-17. tree: Displaying a directory tree
A-18. string functions: C-like string functions
A-19. Directory information
A-20. Object-oriented database
A-21. Library of hash functions
A-22. Colorizing text using hash functions
A-23. Mounting USB keychain storage devices
A-24. Preserving weblogs
A-25. Protecting literal strings
A-26. Unprotecting literal strings
A-27. Spammer Identification
A-28. Spammer Hunt
A-29. Making wget easier to use
A-30. A "podcasting" script
A-31. Basics Reviewed
A-32. An expanded cd command
C-1. Counting Letter Occurrences
K-1. Sample .bashrc file
L-1. VIEWDATA.BAT: DOS Batch File
L-2. viewdata.sh: Shell Script Conversion of VIEWDATA.BAT
P-1. Print the server environment
第一部分 熱身
++++++++++++++++
shell是一個命令解釋器.是介于操作系統kernel與用戶之間的一個絕緣層.準確地說,它也是一
一種強力的計算機語言.一個shell程序,被稱為一個腳本,是一種很容易使用的工具,它可以通過
將系統調用,公共程序,工具,和編譯過的二進制程序粘合在一起來建立應用.事實上,所有的UNIX
命令和工具再加上公共程序,對于shell腳本來說,都是可調用的.如果這些你還覺得不夠,那么
shell內建命令,比如test與循環結構,也會給腳本添加強力的支持和增加靈活性.Shell腳本對于
管理系統任務和其它的重復工作的例程來說,表現的非常好,根本不需要那些華而不實的成熟
緊湊的程序語言.
第1章 為什么使用shell編程
===========================
沒有程序語言是完美的.甚至沒有一個唯一最好的語言,只有對于特定目的,比較適合和不適合
的程序語言.
Herbert Mayer
對于任何想適當精通一些系統管理知識的人來說,掌握shell腳本知識都是最基本的,即使這些
人可能并不打算真正的編寫一些腳本.想一下Linux機器的啟動過程,在這個過程中,必將運行
/etc/rc.d目錄下的腳本來存儲系統配置和建立服務.詳細的理解這些啟動腳本對于分析系統的
行為是非常重要的,并且有時候可能必須修改它.
學習如何編寫shell腳本并不是一件很困難的事,因為腳本可以分為很小的塊,并且相對于shell
特性的操作和選項[1]部分,只需要學習很小的一部分就可以了.語法是簡單并且直觀的,編寫腳
本很像是在命令行上把一些相關命令和工具連接起來,并且只有很少的一部分規則需要學習.
絕大部分腳本第一次就可以正常的工作,而且即使調試一個長一些的腳本也是很直觀的.
一個shell腳本是一個類似于小吃店的(quick and dirty)方法,在你使用原型設計一個復雜的
應用的時候.在工程開發的第一階段,即使從功能中取得很有限的一個子集放到shell腳本中來
完成往往都是非常有用的.使用這種方法,程序的結果可以被測試和嘗試運行,并且在處理使用
諸如C/C++,Java或者Perl語言編寫的最終代碼前,主要的缺陷和陷阱往往就被發現了.
Shell腳本遵循典型的UNIX哲學,就是把大的復雜的工程分成小規模的子任務,并且把這些部件
和工具組合起來.許多人認為這種辦法更好一些,至少這種辦法比使用那種高\大\全的語言更
美,更愉悅,更適合解決問題.比如Perl就是這種能干任何事能適合任何人的語言,但是代價就是
你需要強迫自己使用這種語言來思考解決問題的辦法.
什么時候不使用Shell腳本
資源密集型的任務,尤其在需要考慮效率時(比如,排序,hash等等)
需要處理大任務的數學操作,尤其是浮點運算,精確運算,或者復雜的算術運算
(這種情況一般使用C++或FORTRAN來處理)
有跨平臺移植需求(一般使用C或Java)
復雜的應用,在必須使用結構化編程的時候(需要變量的類型檢查,函數原型,等等)
對于影響系統全局性的關鍵任務應用。
對于安全有很高要求的任務,比如你需要一個健壯的系統來防止入侵,破解,惡意破壞等等.
項目由連串的依賴的各個部分組成。
需要大規模的文件操作
需要多維數組的支持
需要數據結構的支持,比如鏈表或數等數據結構
需要產生或操作圖形化界面GUI
需要直接操作系統硬件
需要I/O或socket接口
需要使用庫或者遺留下來的老代碼的接口
私人的,閉源的應用(shell腳本把代碼就放在文本文件中,全世界都能看到)
如果你的應用符合上邊的任意一條,那么就考慮一下更強大的語言吧--或許是Perl,Tcl,Python,
Ruby -- 或者是更高層次的編譯語言比如C/C++,或者是Java.即使如此,你會發現,使用shell
來原型開發你的應用,在開發步驟中也是非常有用的.
我們將開始使用Bash,Bash是"Bourne-Again shell"首字母的縮寫,也是Stephen Bourne的經典
的Bourne shell的一個雙關語,(譯者:說實話,我一直搞不清這個雙關語是什么意思,為什么叫
"Bourn-Again shell",這其中應該有個什么典故吧,哪位好心,告訴我一下^^).Bash已經成為了
所有UNIX中shell腳本的事實上的標準了.同時這本書也覆蓋了絕大部分的其他一些shell的原
則,比如Korn Shell,Bash從ksh中繼承了一部分特性,[2]C Shell和它的變種.(注意:C Shell
編程是不被推薦的,因為一些特定的內在問題,Tom Christiansen在1993年10月指出了這個問題
請在http://www.etext.org/Quartz/computer/unix/csh.harmful.gz中查看具體內容.)
接下來是腳本的一些說明.在展示shell不同的特征之前,它可以減輕一些閱讀書中例子
的負擔.本書中的例子腳本,都在盡可能的范圍內進行了測試,并且其中的一些將使用在真
實的生活中.讀者可以運行這些例子腳本(使用scriptname.sh或者scriptname.bash的形式),
[3]并給這些腳本執行權限(chmod u+rx scriptname),然后執行它們,看看發生了什么.如果存
檔的腳本不可用,那么就從本書的HTML,pdf或者text的發行版本中把它們拷貝粘貼出來.考慮到
這些腳本中的內容在我們還沒解釋它之前就被列在這里,可能會影響讀者的理解,這就需要讀者
暫時忽略這些內容.
除非特別注明,本書作者編寫了本書中的絕大部分例子腳本.
注意事項:
[1] 這些在builtins章節被引用,這些是shell的內部特征.
[2] ksh88的許多特性,甚至是一些ksh93的特性都被合并到Bash中了.
[3] 根據慣例,用戶編寫的Bourne shell腳本應該在腳本的名字后邊加上.sh擴展名.
一些系統腳本,比如那些在/etc/rc.d中的腳本,則不遵循這種命名習慣.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -