1、译者序毫无疑问,UNIX/Linux 最重要的软件之一就是 shell,目前最流行的 shell 被称为Bash(Bourne AgainShell),几乎所有的 Linux 和绝大部分的 UNIX 都可以使用 Bash。作为系统与用户之间的交互接口,shell几乎是你在 UNIX 工作平台上最亲密的朋友,因此,学好 shell,是学习 Linux/UNIX 的的开始,并且它会始终伴随你的工作学习。shell 是如此地重要,但令人惊奇的是,介绍 shell 的书没有真正令人满意的。所幸的是,我看到了这本被人称为 abs 的书,这本书介绍了 bash 大量的细节和广阔的范围,我遇到的绝大部分的技
2、术问题-无论是我忘记的或是以前没有发现的- 都可以在这本书里找到答案。这本使用大量的例子详细地介绍了 Bash 的语法,各种技巧,调试等等的技术,以循序渐进的学习方式,让你了解Bash 的所有特性,在书中还有许多练习可以引导你思考,以得到更深入的知识。无论你是新手还是老手,或是使用其他语言的程序员,我能肯定你能在此书用受益。而本书除了介绍 BASH 的知识之外,也有许多有用的关于 Linux/UNIX 的知识和其他 shell 的介绍。在看到本书的英文版后,我决定把它翻译出来,在 Linuxsir 论坛上结识了译者之一杨春敏共同翻译这本书,600 多页的书是本大部头的书,我们花了 6 个月的业
3、余时间才翻译完了。关于版权的问题,英文版的作者 Mendel Cooper 对英文版的版权做了详细的约定,请参考:Appendix Q. Copyright。中文版版权由译者杨春敏和黄毅共同所有,在遵守英文版版权相应条款的条件下,欢迎在保留本书译者名字和版权说明以非盈利的方式自由发布此中文版,以盈利目的的所有行为必须联系英文作者和两位中文译者以获得许可。本书得以成稿,我(黄毅)要多谢我的女朋友,本该给予她的时间我用来了翻译,多谢你的理解,你是一个很棒的女朋友!译者 杨春敏 黄毅2006.5.15Advanced Bash-Scripting Guide一本深入学习 shell 脚本艺术的书籍V
4、ersion 3.7.22005/11/16作者:Mendel Coopermail:这本书假定你没有任何脚本或一般程序的编程知识,但是如果你有相关的知识 ,那么你将很容易达到中高级的水平.all the while sneaking in little snippets of UNIX? wisdom andlore(这句不知道怎么译 ).你可以把本书作为教材,自学手册 ,或者你获得 shell 脚本技术的文档.书中的练习和例子脚本中的注释将会与读者有更好的互动,但是最关键的前提是:想真正学习脚本编程的唯一途径就是编写脚本.这本书也可作为教材来讲解一般的编程概念.下载本书最新版本,http:
5、/ tar 和 bzip2 进行打包的,并且是以 HTML 来发行的.当然,你也可以获得本书的 pdf 版本在 http:/www.tldp.org/LDP/abs/abs-guide.pdf.可以在http:/ 中查看修订历史.译者:杨春敏,黄毅mail:一直想好好学习一下 bash,可惜网上的资料都杂乱不堪, 我还是喜欢通过一本书系统的学习.这本书来得正是时候.本书的作者真是非常的严谨,从例子里的改进人名单就能看出来.可惜我水平真的是非常有限,好多地方估计译得都有问题.希望阅读的朋友们多多提些修改建议.我会尽我的最大努力去修正它.目录+第一部分. 热身1. 为什么使用 shell 编程2.
6、 带着一个 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. Tests7.1. Test 结构7.2. 文件测试操作7.3. 其他比较操作7.4. 嵌套的 if/then 条件 test7.5. 检查你的 test 知识8. 操作符和相关的主题8.1. 操作符8.2. 数字常量第三部分. 超越基本9
7、. 变量重游9.1. 内部变量9.2. 操作字符串9.3. 参数替换9.4. 指定类型的变量:declare 或者 typeset9.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. 数
8、学计算命令12.9. 混杂命令13. 系统与管理命令13.1. 分析一个系统脚本14. 命令替换15. 算术扩展16. I/O 重定向16.1. 使用 exec16.2. 代码块的重定向16.3. 应用17. Here Documents17.1. Here Strings18. 休息时间Part 4. 高级19. 正则表达式19.1. 一个简要的正则表达式介绍19.2. 通配20. 子 shell(Subshells)21. 受限 shell(Restricted Shells)22. 进程替换23. 函数23.1. 复杂函数和函数复杂性23.2. 局部变量23.3. 不使用局部变量的递归2
9、4. 别名(Aliases)25. 列表结构26. 数组27. /dev 和 /proc27.1. /dev27.2. /proc28. 关于 Zeros 和 Nulls29. 调试30. 选项31. Gotchas32. 脚本编程风格32.1. 非官方的 Shell 脚本风格33. 杂项33.1. 交互式和非交互式的 shells 和脚本33.2. Shell 包装33.3. 测试和比较: 另一种方法33.4. 递归33.5. 彩色脚本33.6. 优化33.7. 各种小技巧33.8. 安全话题33.8.1. 被感染的脚本33.8.2. 隐藏 Shell 脚本源码33.9. 移植话题33.10
10、. 在 Windows 下进行 Shell 编程34. Bash, 版本 2 和 334.1. Bash, 版本 234.2. Bash, 版本 335. 后记35.1. 作者后记35.2. 关于作者35.3. 哪里可以取得帮助?35.4. 制作这本书的工具35.4.1. 硬件35.4.2. 软件和排版软件35.5. CreditsBibliographyA. Contributed ScriptsB. Reference CardsC. A Sed and Awk Micro-PrimerC.1. SedC.2. AwkD. Exit Codes With Special MeaningsE
11、. 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. ExercisesM.1. Analyzing ScriptsM.2. Writing ScriptsN. Revisi
12、on HistoryO. Mirror SitesP. To Do ListQ. Copyright表格清单:11-1. 作业标识符30-1. Bash 选项33-1. 转义序列中数值和彩色的对应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 ope
13、ratorsC-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. 清除:一个改良的清除脚本2-3. cleanup:一个增强的和广义的删除 logfile 的脚本3-1. 代码块和
14、I/O 重定向3-2. 将一个代码块的结果保存到文件3-3. 在后台运行一个循环3-4. 备份最后一天所有修改的文件.4-1. 变量赋值和替换4-2. 一般的变量赋值4-3. 变量赋值,一般的和比较特殊的4-4. 整型还是 string?4-5. 位置参数4-6. wh,whois 节点名字查询4-7. 使用 shift5-1. echo 一些诡异的变量5-2. 转义符6-1. exit/exit 状态6-2. 否定一个条件使用!7-1. 什么情况下为真?7-2. 几个等效命令 test,/usr/bin/test,和/usr/bin/7-3. 算数测试使用( )7-4. test 死的链接文
15、件7-5. 数字和字符串比较7-6. 测试字符串是否为 null7-7. zmore8-1. 最大公约数8-2. 使用算术操作符8-3. 使用;44 # *!0-9*) echo “Usage: basename $0 file-to-cleanup“; exit $E_WRONGARGS;45 # * ) lines=$1;46 # esac47 #48 #* 直到“Loops“的章节才会对上边的内容进行详细的描述.495051 cd $LOG_DIR5253 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 之前,再确认一遍当前目录是否正确 .5960 # 更有效率的做法是61 #62 # cd /var/log | 63 # echo “Cannot change to necessary directory.“ 65 # 6667686970 tail -$lines messages mesg.temp # 保存log file 消息的最后部分.71 mv mesg.temp messages # 变为新的log 目录.7273