译者序毫无疑问,UNIX/Linux最重要的软件之一就是shell,目前最流行的shell被称为Bash(BourneAgainShell),几乎所有的Linux和绝大部分的UNIX都可以使用Bash。作为系统与用户之间的交互接口,shell几乎是你在UNIX工作平台上最亲密的朋友,因此,学好shell,是学习Linux/UNIX的的开始,并且它会始终伴随你的工作学习。shell是如此地重要,但令人惊奇的是,介绍shell的书没有真正令人满意的。所幸的是,我看到了这本被人称为abs的书,这本书介绍了bash大量的细节和广阔的范围,我遇到的绝大部分的技术问题--无论是我忘记的或是以前没有发现的--都可以在这本书里找到答案。这本使用大量的例子详细地介绍了Bash的语法,各种技巧,调试等等的技术,以循序渐进的学习方式,让你了解Bash的所有特性,在书中还有许多练习可以引导你思考,以得到更深入的知识。无论你是新手还是老手,或是使用其他语言的程序员,我能肯定你能在此书用受益。而本书除了介绍BASH的知识之外,也有许多有用的关于Linux/UNIX的知识和其他shell的介绍。在看到本书的英文版后,我决定把它翻译出来,在Linuxsir论坛上结识了译者之一杨春敏共同翻译这本书,600多页的书是本大部头的书,我们花了6个月的业余时间才翻译完了。关于版权的问题,英文版的作者MendelCooper对英文版的版权做了详细的约定,请参考:AppendixQ.Copyright。中文版版权由译者杨春敏和黄毅共同所有,在遵守英文版版权相应条款的条件下,欢迎在保留本书译者名字和版权说明以非盈利的方式自由发布此中文版,以盈利目的的所有行为必须联系英文作者和两位中文译者以获得许可。本书得以成稿,我(黄毅)要多谢我的女朋友,本该给予她的时间我用来了翻译,多谢你的理解,你是一个很棒的女朋友!译者杨春敏黄毅2006.5.15AdvancedBash-ScriptingGuide高级Bash脚本编程指南一本深入学习shell脚本艺术的书籍Version3.7.22005/11/16作者:MendelCoopermail:thegrendel@theriver.com这本书假定你没有任何脚本或一般程序的编程知识,但是如果你有相关的知识,那么你将很容易达到中高级的水平...allthewhilesneakinginlittlesnippetsofUNIX?wisdomandlore(这句不知道怎么译).你可以把本书作为教材,自学手册,或者你获得shell脚本技术的文档.书中的练习和例子脚本中的注释将会与读者有更好的互动,但是最关键的前提是:想真正学习脚本编程的唯一途径就是编写脚本.这本书也可作为教材来讲解一般的编程概念.下载本书最新版本,~thegrendel/abs-guide-3.7.tar.bz2,这是一个以tar和bzip2进行打包的,并且是以HTML来发行的.当然,你也可以获得本书的pdf版本在可以在~thegrendel/Change.log中查看修订历史.译者:杨春敏,黄毅mail:chunmin.yang@gmail.com一直想好好学习一下bash,可惜网上的资料都杂乱不堪,我还是喜欢通过一本书系统的学习.这本书来得正是时候.本书的作者真是非常的严谨,从例子里的改进人名单就能看出来.可惜我水平真的是非常有限,好多地方估计译得都有问题.希望阅读的朋友们多多提些修改建议.我会尽我的最大努力去修正它.目录++++第一部分.热身1.为什么使用shell编程2.带着一个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.变量重游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.数学计算命令12.9.混杂命令13.系统与管理命令13.1.分析一个系统脚本14.命令替换15.算术扩展16.I/O重定向16.1.使用exec16.2.代码块的重定向16.3.应用17.HereDocuments17.1.HereStrings18.休息时间Part4.高级19.正则表达式19.1.一个简要的正则表达式介绍19.2.通配20.子shell(Subshells)21.受限shell(RestrictedShells)22.进程替换23.函数23.1.复杂函数和函数复杂性23.2.局部变量23.3.不使用局部变量的递归24.别名(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.在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.ContributedScriptsB.ReferenceCardsC.ASedandAwkMicro-PrimerC.1.SedC.2.AwkD.ExitCodesWithSpecialMeaningsE.ADetailedIntroductiontoI/OandI/ORedirectionF.StandardCommand-LineOptionsG.ImportantFilesH.ImportantSystemDirectoriesI.LocalizationJ.HistoryCommandsK.ASample.bashrcFileL.ConvertingDOSBatchFilestoShellScriptsM.ExercisesM.1.AnalyzingScriptsM.2.WritingScriptsN.RevisionHistoryO.MirrorSitesP.ToDoListQ.Copyright表格清单:11-1.作业标识符30-1.Bash选项33-1.转义序列中数值和彩色的对应B-1.SpecialShellVariablesB-2.TESTOperators:BinaryComparisonB-3.TESTOperators:FilesB-4.ParameterSubstitutionandExpansionB-5.StringOperationsB-6.MiscellaneousConstructsC-1.BasicsedoperatorsC-2.ExamplesofsedoperatorsD-1.ReservedExitCodesL-1.Batchfilekeywords/variables/operators,andtheirshellequivalentsL-2.DOScommandsandtheirUNIXequivalentsN-1.RevisionHistory例子清单:2-1.清除:清除/var/log下的log文件2-2.清除:一个改良的清除脚本2-3.cleanup:一个增强的和广义的删除logfile的脚本3-1.代码块和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死的链接文件7-5.数字和字符串比较7-6.测试字符串是否为null7-7.zmore8-1.最大公约数8-2.使用算术操作符8-3.使用&&和||进行混合状态的test8-4.数字常量的处理9-1.$IFS和空白9-2.时间输入9-3.再来一个时间输入9-4.Timedread9-5.我是root?9-6.arglist:通过$*和$@列出所有的参数9-7.不一致的$*和$@行为9-8.当$IFS为空时的$*和$@9-9.下划线变量9-10.在一个文本文件的段间插入空行9-11.利用修改文件名,来转换图片格式9-12.模仿getopt命令9-13.提取字符串的一种可选的方法9-14.使用参数替换和errormessages9-15.参数替换和usagemessages9-16.变量长度9-17.参数替换中的模式匹配9-18.重命名文件扩展名9-19.使用模式匹配来分析比较特殊的字符串9-20.对字符串的前缀或后缀使用匹配模式9-21.使用declare来指定变量的类型9-22.间接引用9-23.传递一个间接引用给awk9-24.产生随机数9-25.从一副扑克牌中取出一张随机的牌9-26.两个指定值之间的随机数9-27.使用随机数来摇一个骰子9-28.重新分配随机数种子9-29.使用awk产生伪随机数9-30.C风格的变量处理10-1.循环的一个简单例子10-2.每个[list]元素带两个参数的for循环10-3.文件信息:对包含在变量中的文件列表进行操作10-4.在for循环中操作文件10-5.在for循环中省略[list]10-6.使用命令替换来产生for循环的[list]10-7.对于二进制文件的一个grep替换10-8.列出系统上的所有用户10-9.在目录的所有文件中查找源字串10-10.列出目录中所有的符号连接文件10-11.将目录中的符号连接文件名保存到一个文件中10-12.一个C风格的for循环10-13.在batchmode中使用efax10-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.多层循环的continue10-23.在实际的任务中使用