关闭

关闭

封号提示

内容

首页 高级Bash脚本编程指南.pdf

高级Bash脚本编程指南.pdf

高级Bash脚本编程指南.pdf

上传者: 筱筱 2011-06-27 评分1 评论0 下载7 收藏0 阅读量380 暂无简介 简介 举报

简介:本文档为《高级Bash脚本编程指南pdf》,可适用于IT/计算机领域,主题内容包含译者序毫无疑问UNIXLinux最重要的软件之一就是shell目前最流行的shell被称为Bash(BourneAgainShell)几乎所有的Li符等。

译者序毫无疑问UNIXLinux最重要的软件之一就是shell目前最流行的shell被称为Bash(BourneAgainShell)几乎所有的Linux和绝大部分的UNIX都可以使用Bash。作为系统与用户之间的交互接口shell几乎是你在UNIX工作平台上最亲密的朋友因此学好shell是学习LinuxUNIX的的开始并且它会始终伴随你的工作学习。shell是如此地重要但令人惊奇的是介绍shell的书没有真正令人满意的。所幸的是我看到了这本被人称为abs的书这本书介绍了bash大量的细节和广阔的范围我遇到的绝大部分的技术问题无论是我忘记的或是以前没有发现的都可以在这本书里找到答案。这本使用大量的例子详细地介绍了Bash的语法各种技巧调试等等的技术以循序渐进的学习方式让你了解Bash的所有特性在书中还有许多练习可以引导你思考以得到更深入的知识。无论你是新手还是老手或是使用其他语言的程序员我能肯定你能在此书用受益。而本书除了介绍BASH的知识之外也有许多有用的关于LinuxUNIX的知识和其他shell的介绍。在看到本书的英文版后我决定把它翻译出来在Linuxsir论坛上结识了译者之一杨春敏共同翻译这本书多页的书是本大部头的书我们花了个月的业余时间才翻译完了。关于版权的问题英文版的作者MendelCooper对英文版的版权做了详细的约定请参考:AppendixQCopyright。中文版版权由译者杨春敏和黄毅共同所有在遵守英文版版权相应条款的条件下欢迎在保留本书译者名字和版权说明以非盈利的方式自由发布此中文版以盈利目的的所有行为必须联系英文作者和两位中文译者以获得许可。本书得以成稿我(黄毅)要多谢我的女朋友本该给予她的时间我用来了翻译多谢你的理解你是一个很棒的女朋友!译者杨春敏黄毅AdvancedBashScriptingGuide<<高级Bash脚本编程指南>>一本深入学习shell脚本艺术的书籍Version作者:MendelCoopermail:thegrendeltherivercom这本书假定你没有任何脚本或一般程序的编程知识,但是如果你有相关的知识,那么你将很容易达到中高级的水平allthewhilesneakinginlittlesnippetsofUNIXwisdomandlore(这句不知道怎么译)你可以把本书作为教材,自学手册,或者你获得shell脚本技术的文档书中的练习和例子脚本中的注释将会与读者有更好的互动,但是最关键的前提是:想真正学习脚本编程的唯一途径就是编写脚本这本书也可作为教材来讲解一般的编程概念下载本书最新版本,http:personalriveruserscom~thegrendelabsguidetarbz,这是一个以tar和bzip进行打包的,并且是以HTML来发行的当然,你也可以获得本书的pdf版本在http:wwwtldporgLDPabsabsguidepdf可以在http:personalriveruserscom~thegrendelChangelog中查看修订历史译者:杨春敏黄毅mail:chunminyanggmailcom一直想好好学习一下bash,可惜网上的资料都杂乱不堪,我还是喜欢通过一本书系统的学习这本书来得正是时候本书的作者真是非常的严谨,从例子里的改进人名单就能看出来可惜我水平真的是非常有限,好多地方估计译得都有问题希望阅读的朋友们多多提些修改建议我会尽我的最大努力去修正它目录第一部分热身为什么使用shell编程带着一个ShaBang出发(ShaBang指的是#!)调用一个脚本初步的练习第二部分基本特殊字符变量和参数的介绍变量替换变量赋值Bash变量是不分类型的特殊的变量类型引用(翻译的可能有问题,特指引号)引用变量转义()退出和退出状态TestsTest结构文件测试操作其他比较操作嵌套的ifthen条件test检查你的test知识操作符和相关的主题操作符数字常量第三部分超越基本变量重游内部变量操作字符串参数替换指定类型的变量:declare或者typeset变量的间接引用$RANDOM:产生随机整数双圆括号结构循环和分支循环嵌套循环循环控制测试与分支(case和select结构)内部命令与内建作业控制命令外部过滤器,程序和命令基本命令复杂命令时间日期命令文本处理命令文件与归档命令通讯命令终端控制命令数学计算命令混杂命令系统与管理命令分析一个系统脚本命令替换算术扩展IO重定向使用exec代码块的重定向应用HereDocumentsHereStrings休息时间Part高级正则表达式一个简要的正则表达式介绍通配子shell(Subshells)受限shell(RestrictedShells)进程替换函数复杂函数和函数复杂性局部变量不使用局部变量的递归别名(Aliases)列表结构数组dev和procdevproc关于Zeros和s调试选项Gotchas脚本编程风格非官方的Shell脚本风格杂项交互式和非交互式的shells和脚本Shell包装测试和比较:另一种方法递归彩色脚本优化各种小技巧安全话题被感染的脚本隐藏Shell脚本源码移植话题在Windows下进行Shell编程Bash,版本和Bash,版本Bash,版本后记作者后记关于作者哪里可以取得帮助制作这本书的工具硬件软件和排版软件CreditsBibliographyAContributedScriptsBReferenceCardsCASedandAwkMicroPrimerCSedCAwkDExitCodesWithSpecialMeaningsEADetailedIntroductiontoIOandIORedirectionFStandardCommandLineOptionsGImportantFilesHImportantSystemDirectoriesILocalizationJHistoryCommandsKASamplebashrcFileLConvertingDOSBatchFilestoShellScriptsMExercisesMAnalyzingScriptsMWritingScriptsNRevisionHistoryOMirrorSitesPToDoListQCopyright表格清单:作业标识符Bash选项转义序列中数值和彩色的对应BSpecialShellVariablesBTESTOperators:BinaryComparisonBTESTOperators:FilesBParameterSubstitutionandExpansionBStringOperationsBMiscellaneousConstructsCBasicsedoperatorsCExamplesofsedoperatorsD"Reserved"ExitCodesLBatchfilekeywordsvariablesoperators,andtheirshellequivalentsLDOScommandsandtheirUNIXequivalentsNRevisionHistory例子清单:清除:清除varlog下的log文件清除:一个改良的清除脚本cleanup:一个增强的和广义的删除logfile的脚本代码块和IO重定向将一个代码块的结果保存到文件在后台运行一个循环备份最后一天所有修改的文件变量赋值和替换一般的变量赋值变量赋值,一般的和比较特殊的整型还是string位置参数wh,whois节点名字查询使用shiftecho一些诡异的变量转义符exitexit状态否定一个条件使用!什么情况下为真几个等效命令test,usrbintest,,和usrbin算数测试使用(())test死的链接文件数字和字符串比较测试字符串是否为zmore最大公约数使用算术操作符使用和||进行混合状态的test数字常量的处理$IFS和空白时间输入再来一个时间输入Timedread我是rootarglist:通过$*和$列出所有的参数不一致的$*和$行为当$IFS为空时的$*和$下划线变量在一个文本文件的段间插入空行利用修改文件名,来转换图片格式模仿getopt命令提取字符串的一种可选的方法使用参数替换和errormessages参数替换和"usage"messages变量长度参数替换中的模式匹配重命名文件扩展名使用模式匹配来分析比较特殊的字符串对字符串的前缀或后缀使用匹配模式使用declare来指定变量的类型间接引用传递一个间接引用给awk产生随机数从一副扑克牌中取出一张随机的牌两个指定值之间的随机数使用随机数来摇一个骰子重新分配随机数种子使用awk产生伪随机数C风格的变量处理循环的一个简单例子每个list元素带两个参数的for循环文件信息:对包含在变量中的文件列表进行操作在for循环中操作文件在for循环中省略list使用命令替换来产生for循环的list对于二进制文件的一个grep替换列出系统上的所有用户在目录的所有文件中查找源字串列出目录中所有的符号连接文件将目录中的符号连接文件名保存到一个文件中一个C风格的for循环在batchmode中使用efax简单的while循环另一个while循环多条件的while循环C风格的while循环until循环嵌套循环break和continue命令在循环中的效果多层循环的退出多层循环的continue在实际的任务中使用"continueN"使用case使用case来创建菜单使用命令替换来产生case变量简单字符串匹配检查是否是字母输入用select来创建菜单用函数中select结构来创建菜单一个fork出多个自己实例的脚本printf使用read,变量分配当使用一个不带变量参数的read命令时,将会发生什么read命令的多行输入检测方向键通过文件重定向来使用read管道输出到read中的问题修改当前的工作目录用"let"命令来作算术操作显示eval命令的效果强制登出(logoff)另一个"rot"的版本在Perl脚本中使用eval命令来强制变量替换使用set来改变脚本的位置参数重新分配位置参数Unset一个变量使用export命令传递一个变量到一个内嵌awk的脚本中使用getopts命令来读取传递给脚本的选项参数"Including"一个数据文件一个没什么用的,source自身的脚本exec的效果一个exec自身的脚本在继续处理之前,等待一个进程的结束一个结束自身的脚本使用ls命令来创建一个烧录CDR的内容列表HelloorGoodbye删除当前目录下文件名中包含一些特殊字符(包括空白)的文件通过文件的inode号来删除文件Logfile:使用xargs来监控系统log把当前目录下的文件拷贝到另一个文件中通过名字Kill进程使用xargs分析单词出现的频率使用expr使用date命令分析单词出现的频率那个文件是脚本产生进制随机数使用tail命令来监控系统log在一个脚本中模仿"grep"的行为在年的韦氏词典中查找定义检查列表中单词的正确性转换大写:把一个文件的内容全部转换为大写转换小写:将当前目录下的所有文全部转换为小写Du:DOS到UNIX文本文件的转换rot:rot,弱智加密Generating"CryptoQuote"Puzzles格式化文件列表使用column来格式化目录列表nl:一个自己计算行号的脚本manview:查看格式化的man页使用cpio来拷贝一个目录树解包一个rpm归档文件从C文件中去掉注释ExploringusrXRbin一个"改进过"的strings命令在一个脚本中使用cmp来比较个文件basename和dirname检查文件完整性Uudecod编码后的文件查找滥用的连接来报告垃圾邮件发送者分析一个垃圾邮件域获得一份股票报价更新FedoraCore使用ssh一个可以mail自己的脚本按月偿还贷款数制转换使用"heredocument"来调用bc计算圆周率将进制数字转换为进制数字因子分解计算直角三角形的斜边使用seq来产生循环参数字母统计使用getopt来分析命令行选项一个拷贝自身的脚本练习dd记录按键安全的删除一个文件文件名产生器将米转换为英里使用m设置一个新密码设置一个擦除字符关掉终端对于密码的echo按键检测Checkingaremoteserverforidentd<rojybug>pidof帮助杀掉一个进程检查一个CD镜像在一个文件中创建文件系统添加一个新的硬盘驱动器使用umask来将输出文件隐藏起来killall,来自于etcrcdinitd愚蠢的脚本策略从循环的输出中产生一个变量找anagram(回文构词法,可以将一个有意义的单词,变换为个或多个有意义的单词,但是还是原来的子母集合)使用exec重定向标准输入使用exec来重定向stdout使用exec在同一脚本中重定向stdin和stdout避免子shellwhile循环的重定向另一种while循环的重定向until循环重定向for循环重定向for循环重定向loop(将标准输入和标准输出都重定向了)重定向ifthen测试结构用于上面例子的"namesdata"数据文件记录日志事件广播:发送消息给每个登录上的用户仿造文件:创建一个两行的仿造文件使用cat的多行消息带有抑制tab功能的多行消息使用参数替换的heredocument上传一个文件对到"Sunsite"的incoming目录关闭参数替换一个产生另外一个脚本的脚本Heredocuments与函数"匿名"hereDocument注释掉一段代码块一个自文档化(selfdocumenting)的脚本在一个文件的开头添加文本子shell中的变量作用域列出用户的配置文件在子shell里进行串行处理在受限的情况下运行脚本简单函数带着参数的函数函数和被传给脚本的命令行参数传递间接引用给函数解除传递给函数的参数引用再次尝试解除传递给函数的参数引用两个数中的最大者把数字转化成罗马数字测试函数最大的返回值比较两个大整数用户名的真实名局部变量的可见范围用局部变量来递归汉诺塔脚本中的别名unalias:设置和删除别名使用"与列表(andlist)"来测试命令行参数用"与列表"的另一个命令行参数测试"或列表"和"与列表"的结合使用简单的数组用法格式化一首诗多种数组操作用于数组的字符串操作符将脚本的内容传给数组一些数组专用的工具关于空数组和空数组元素初始化数组复制和连接数组关于连接数组的更多信息一位老朋友:冒泡排序内嵌数组和间接引用复杂数组应用:埃拉托色尼素数筛子模拟下推的堆栈复杂的数组应用:列出一种怪异的数学序列模拟二维数组,并使它倾斜利用devtcp来检修故障搜索与一个PID相关的进程网络连接状态隐藏cookie而不再使用用devzero创建一个交换临时文件创建ramdisk一个错误的脚本丢失关键字(keyword)另一个错误脚本用"assert"测试条件捕捉exit在ControlC后清除垃圾跟踪变量运行多进程(在多处理器的机器里)数字和字符串比较是不相等同的子SHELL缺陷把echo的输出用管道输送给read命令shell包装稍微复杂一些的shell包装写到日志文件的shell包装包装awk的脚本另一个包装awk的脚本把Perl嵌入Bash脚本Bash和Perl脚本联合使用递归调用自己本身的(无用)脚本递归调用自己本身的(有用)脚本另一个递归调用自己本身的(有用)脚本一个"彩色的"地址资料库画盒子显示彩色文本"赛马"游戏返回值技巧整型还是string传递和返回数组anagrams游戏在shell脚本中调用的窗口部件字符串扩展间接变量引用新方法使用间接变量引用的简单数据库应用用数组和其他的小技巧来处理四人随机打牌Amailformat:FormattinganemailmessageArn:AsimplemindedfilerenameutilityAblankrename:renamesfilenamescontainingblanksAencryptedpw:Uploadingtoanftpsite,usingalocallyencryptedpasswordAcopycd:CopyingadataCDACollatzseriesAdaysbetween:CalculatenumberofdaysbetweentwodatesAMakea"dictionary"ASoundexconversionA"GameofLife"ADatafilefor"GameofLife"Abehead:RemovingmailandnewsmessageheadersAftpget:DownloadingfilesviaftpApassword:GeneratingrandomcharacterpasswordsAfifo:Makingdailybackups,usingnamedpipesAGeneratingprimenumbersusingthemodulooperatorAtree:DisplayingadirectorytreeAstringfunctions:ClikestringfunctionsADirectoryinformationAObjectorienteddatabaseALibraryofhashfunctionsAColorizingtextusinghashfunctionsAMountingUSBkeychainstoragedevicesAPreservingweblogsAProtectingliteralstringsAUnprotectingliteralstringsASpammerIdentificationASpammerHuntAMakingwgeteasiertouseAA"podcasting"scriptABasicsReviewedAAnexpandedcdcommandCCountingLetterOccurrencesKSamplebashrcfileLVIEWDATABAT:DOSBatchFileLviewdatash:ShellScriptConversionofVIEWDATABATPPrinttheserverenvironment第一部分热身shell是一个命令解释器是介于操作系统kernel与用户之间的一个绝缘层准确地说,它也是一一种强力的计算机语言一个shell程序,被称为一个脚本,是一种很容易使用的工具,它可以通过将系统调用,公共程序,工具,和编译过的二进制程序粘合在一起来建立应用事实上,所有的UNIX命令和工具再加上公共程序,对于shell脚本来说,都是可调用的如果这些你还觉得不够,那么shell内建命令,比如test与循环结构,也会给脚本添加强力的支持和增加灵活性Shell脚本对于管理系统任务和其它的重复工作的例程来说,表现的非常好,根本不需要那些华而不实的成熟紧凑的程序语言第章为什么使用shell编程===========================没有程序语言是完美的甚至没有一个唯一最好的语言,只有对于特定目的,比较适合和不适合的程序语言HerbertMayer对于任何想适当精通一些系统管理知识的人来说,掌握shell脚本知识都是最基本的,即使这些人可能并不打算真正的编写一些脚本想一下Linux机器的启动过程,在这个过程中,必将运行etcrcd目录下的脚本来存储系统配置和建立服务详细的理解这些启动脚本对于分析系统的行为是非常重要的,并且有时候可能必须修改它学习如何编写shell脚本并不是一件很困难的事,因为脚本可以分为很小的块,并且相对于shell特性的操作和选项部分,只需要学习很小的一部分就可以了语法是简单并且直观的,编写脚本很像是在命令行上把一些相关命令和工具连接起来,并且只有很少的一部分规则需要学习绝大部分脚本第一次就可以正常的工作,而且即使调试一个长一些的脚本也是很直观的一个shell脚本是一个类似于小吃店的(quickanddirty)方法,在你使用原型设计一个复杂的应用的时候在工程开发的第一阶段,即使从功能中取得很有限的一个子集放到shell脚本中来完成往往都是非常有用的使用这种方法,程序的结果可以被测试和尝试运行,并且在处理使用诸如CC,Java或者Perl语言编写的最终代码前,主要的缺陷和陷阱往往就被发现了Shell脚本遵循典型的UNIX哲学,就是把大的复杂的工程分成小规模的子任务,并且把这些部件和工具组合起来许多人认为这种办法更好一些,至少这种办法比使用那种高大全的语言更美,更愉悦,更适合解决问题比如Perl就是这种能干任何事能适合任何人的语言,但是代价就是你需要强迫自己使用这种语言来思考解决问题的办法什么时候不使用Shell脚本资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash等等)需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C或FORTRAN来处理)有跨平台移植需求(一般使用C或Java)复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)对于影响系统全局性的关键任务应用。对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵,破解,恶意破坏等等项目由连串的依赖的各个部分组成。需要大规模的文件操作需要多维数组的支持需要数据结构的支持,比如链表或数等数据结构需要产生或操作图形化界面GUI需要直接操作系统硬件需要IO或socket接口需要使用库或者遗留下来的老代码的接口私人的,闭源的应用(shell脚本把代码就放在文本文件中,全世界都能看到)如果你的应用符合上边的任意一条,那么就考虑一下更强大的语言吧或许是Perl,Tcl,Python,Ruby或者是更高层次的编译语言比如CC,或者是Java即使如此,你会发现,使用shell来原型开发你的应用,在开发步骤中也是非常有用的我们将开始使用Bash,Bash是"BourneAgainshell"首字母的缩写,也是StephenBourne的经典的Bourneshell的一个双关语,(译者:说实话,我一直搞不清这个双关语是什么意思,为什么叫"BournAgainshell",这其中应该有个什么典故吧,哪位好心,告诉我一下^^)Bash已经成为了所有UNIX中shell脚本的事实上的标准了同时这本书也覆盖了绝大部分的其他一些shell的原则,比如KornShell,Bash从ksh中继承了一部分特性,CShell和它的变种(注意:CShell编程是不被推荐的,因为一些特定的内在问题,TomChristiansen在年月指出了这个问题请在http:wwwetextorgQuartzcomputerunixcshharmfulgz中查看具体内容)接下来是脚本的一些说明在展示shell不同的特征之前,它可以减轻一些阅读书中例子的负担本书中的例子脚本,都在尽可能的范围内进行了测试,并且其中的一些将使用在真实的生活中读者可以运行这些例子脚本(使用scriptnamesh或者scriptnamebash的形式),并给这些脚本执行权限(chmodurxscriptname),然后执行它们,看看发生了什么如果存档的脚本不可用,那么就从本书的HTML,pdf或者text的发行版本中把它们拷贝粘贴出来考虑到这些脚本中的内容在我们还没解释它之前就被列在这里,可能会影响读者的理解,这就需要读者暂时忽略这些内容除非特别注明,本书作者编写了本书中的绝大部分例子脚本注意事项:这些在builtins章节被引用,这些是shell的内部特征ksh的许多特性,甚至是一些ksh的特性都被合并到Bash中了根据惯例,用户编写的Bourneshell脚本应该在脚本的名字后边加上sh扩展名一些系统脚本,比如那些在etcrcd中的脚本,则不遵循这种命名习惯第章带着一个ShaBang出发(ShaBang指的是#!)==============================================在一个最简单的例子中,一个shell脚本其实就是将一堆系统命令列在一个文件中它的最基本的用处就是,在你每次输入这些特定顺序的命令时可以少敲一些字Example清除:清除varlog下的log文件################################StartScript########################################Cleanup#当然要使用root身份来运行这个脚本cdvarlogcatdev>messagescatdev>wtmpecho"Logscleanedup"################################EndScript#########################################这根本就没什么稀奇的,只不过是命令的堆积,来让从console或者xterm中一个一个的输入命令更方便一些好处就是把所有命令都放在一个脚本中,不用每次都敲它们这样的话,对于特定的应用来说,这个脚本就很容易被修改或定制Example清除:一个改良的清除脚本################################StartScript########################################!binbash#一个Bash脚本的正确的开头部分#Cleanup,版本#当然要使用root身份来运行#在此处插入代码,来打印错误消息,并且在不是root身份的时候退出LOGDIR=varlog#如果使用变量,当然比把代码写死的好cd$LOGDIRcatdev>messagescatdev>wtmpecho"Logscleanedup"exit#这个命令是一种正确并且合适的退出脚本的方法################################EndScript#########################################现在,让我们看一下一个真正意义的脚本而且我们可以走得更远Examplecleanup:一个增强的和广义的删除logfile的脚本################################StartScript########################################!binbash#清除,版本#Warning:##这个脚本有好多特征,这些特征是在后边章节进行解释的,大概是进行到本书的一半的#时候,#你就会觉得它没有什么神秘的了#LOGDIR=varlogROOTUID=#$UID为的时候,用户才具有根用户的权限LINES=#默认的保存行数EXCD=#不能修改目录ENOTROOT=#非根用户将以error退出#当然要使用根用户来运行if"$UID"ne"$ROOTUID"thenecho"Mustberoottorunthisscript"exit$ENOTROOTfiifn"$"#测试是否有命令行参数(非空)thenlines=$elselines=$LINES#默认,如果不在命令行中指定fi#StephaneChazelas建议使用下边#的更好方法来检测命令行参数#但对于这章来说还是有点超前##EWRONGARGS=#非数值参数(错误的参数格式)##case"$"in#"")lines=#*!*)echo"Usage:`basename$`filetocleanup"exit$EWRONGARGS#*)lines=$#esac##*直到"Loops"的章节才会对上边的内容进行详细的描述cd$LOGDIRif`pwd`!="$LOGDIR"#或者if"$PWD"!="$LOGDIR"#不在varlog中thenecho"Can'tchangeto$LOGDIR"exit$EXCDfi#在处理logfile之前,再确认一遍当前目录是否正确#更有效率的做法是##cdvarlog||{#echo"Cannotchangetonecessarydirectory">#exit$EXCD#}tail$linesmessages>mesgtemp#保存logfile消息的最后部分mvmesgtempmessages#变为新的log目录#catdev>messages#*不再需要了,使用上边的方法更安全catdev>wtmp#':>wtmp'和'>wtmp'具有相同的作用echo"Logscleanedup"exit#退出之前返回,返回表示成功#################################EndScript#########################################因为你可能希望将系统log全部消灭,这个版本留下了log消息最后的部分你将不断地找到新的方法来完善这个脚本,并提高效率要注意,在每个脚本的开头都使用"#!",这意味着告诉你的系统这个文件的执行需要指定一个解释器#!实际上是一个字节的魔法数字,这是指定一个文件类型的特殊标记,换句话说,在这种情况下,指的就是一个可执行的脚本(键入manmagic来获得关于这个迷人话题的更多详细信息)在#!之后接着是一个路径名这个路径名指定了一个解释脚本中命令的程序,这个程序可以是shell,程序语言或者是任意一个通用程序这个指定的程序从头开始解释并且执行脚本中的命令(从#!行下边的一行开始),忽略注释如:#!binsh#!binbash#!usrbinperl#!usrbintcl#!binsedf#!usrawkf上边每一个脚本头的行都指定了一个不同的命令解释器,如果是binsh,那么就是默认shell(在Linux系统中默认是Bash)使用#!binsh,在大多数商业发行的UNIX上,默认是Bourneshell,这将让你的脚本可以正常的运行在非Linux机器上,虽然这将会牺牲Bash一些独特的特征脚本将与POSIX的sh标准相一致注意:#!后边给出的路径名必须是正确的,否则将会出现一个错误消息,通常是"Commandnotfound",这将是你运行这个脚本时所得到的唯一结果当然"#!"也可以被忽略,不过这样你的脚本文件就只能是一些命令的集合,不能够使用shell内建的指令了,如果不能使用变量的话,当然这也就失去了脚本编程的意义了注意:这个例子鼓励你使用模块化的方式来编写脚本,平时也要注意收集一些零碎的代码,这些零碎的代码可能用在你将来编写的脚本中这样你就可以通过这些代码片段来构造一个较大的工程用例以下边脚本作为序,来测试脚本被调用的参数是否正确################################StartScript##################################

类似资料

该用户的其他资料

谭浩强C语言_完整版.doc

JSP高级编程(希望版).pdf

Lotus Domino 8..doc

Asp.Net深入编程.pdf

无线路由器密码破解.doc

职业精品

精彩专题

结婚彩礼真有那么重要吗?

原创于西周而后沿袭至今的彩礼,虽然被一部分家长奉为圭臬,但越来越多的年轻人对结婚必须要彩礼不以为然。彩礼引发的社会矛盾越来越受到关注,结婚是自己的事,如人饮水冷暖自知,至于要不要彩礼或者要多少彩礼,因人而异,因财力而已,不可一概而论。

用户评论

0/200
    暂无评论
上传我的资料

精选资料

热门资料排行换一换

  • IT外包服务项目.doc

  • 如何判断技术指标的背离(以MAC…

  • 如何判断MACD的背离.doc

  • 看图识股-特定图形2.doc

  • 基于Agent的建模技术研究.p…

  • [一万小时天才理论].PDF

  • 自私的基因.(英)里查德.道金斯…

  • 北朝礼制法系研究.pdf

  • 资料评价:

    / 590
    所需积分:5 立即下载

    意见
    反馈

    返回
    顶部