Shell编程教程完整版_第1页
Shell编程教程完整版_第2页
Shell编程教程完整版_第3页
Shell编程教程完整版_第4页
Shell编程教程完整版_第5页
已阅读5页,还剩117页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章 Shell简介 6什么是Shell,Shell命令的两种执行方式 7第2章 几种常见的Shell 8bash 10sh 11ash 12csh 13ksh 14第3章 Shell与编译型语言的差异 15编译型语言 17解释型语言 18第4章 什么时候使用Shell 19第5章 第一个Shell脚本 21作为可执行程序 23作为解释器参数 24第6章 Shell变量:Shell变量的定义、删除变量、只读变量、变量类型 25定义变量 27使用变量 28重新定义变量 29只读变量 30删除变量 31变量类型 32第7章 Shell特殊变量:Shell$0,$#,$*,$@,$?,$$和命令行参数 33命令行参数 35$*和$@的区别 36退出状态 38第8章 Shell替换 39命令替换 41变量替换 42第9章 Shell运算符:Shell算数运算符、关系运算符、布尔运算符、字符串运算符等44算术运算符 46关系运算符 48布尔运算符 50字符串运算符 52文件测试运算符 54第10章 Shell注释 57第11章 Shell字符串 59单引号 61双引号 62拼接字符串 63获取字符串长度 64提取子字符串 65查找子字符串 66第12章 Shell数组:shell数组的定义、数组长度 67定义数组 69读取数组 70获取数组的长度 72第13章 Shellecho命令 73显示转义字符 75显示变量 76显示换行 77显示不换行...............................................................78显示结果重定向至文件.......................................................79原样输出字符串............................................................80显示命令执行结果...........................................................81第14章Shellprintf命令:格式化输出语句..................................82第15章Shellifelse语句..............................................851)if...else语句...........................................................872)if...else...fi语句.......................................................883)if...elif...fi语句.........................................................89第16章Shellcaseesac语句..........................................91第17章Shellfor循环................................................94第18章 Shellwhile循环 97第19章 Shelluntil循环 99第20章 Shellbreak和continue命令 101break命令 103continue命令 105第21章 Shell函数:Shell函数返回值、删除函数、在终端调用函数 107第22章 Shell函数参数 111第23章 Shell输入输出重定向:ShellHereDocument,/dev/null 113输出重定向 115输入重定向 116重定向深入讲解 117HereDocument 119/dev/null文件 121第24 Shell文件包 Shell简介1Shell|什么是Shell,ShellShellCUnix/LinuxShell成的。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命分支。它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell其使用方法,是用好Unix/Linux系统的关键。ShellUnix/Linux入门教程Unix/LinuxShell有两种执行命令的方式:(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些ShellrootShellroot,那就不同了,只要敲几个字母,就可能导致灾难性后果。几种常见的2Shell|上面提到过,ShellUnix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,习惯上把它们称作一种Shell。我们常说有Shell,Shell。bashLinuxshell,bash讲解。bashBrianFoxChetRameyBourneAgainShell40个。Linux使用它作为默认的shell是因为它有诸如以下的特色:-可以使用类似DOS下面的doskey的功能,用helpshSteveBourneBourneShell,shUnixshellashshellKennethAlmquist,Linuxshell,它只包含24个内部命cshLinuxWilliamJoy47位作者编成,共有52shell/bin/tcshshell,也就是说,cshtcsh。kshKornshellEricGisin42shellksh注意:bashBourneAgainShelllinuxshellBourneshell,CshellKornshellbashsh,shbashShell3Shell|Fortran、Ada、Pascal、C、C+Java,都是编译型语言。这类语言需要运行程序时,直接读取目标代码(objectcode)。由于编译后的目标代码(objectcode)非常接近计算机底层,因但是,由于编译型语言多半运作于底层,所处理的是字节、整数、浮点数或是其他机器层级的对象,往往实现一个简单的功能需要大量复杂的代码。例如,在+中”之类的简单操作。解释型语言也被称作“脚本语言”。执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(sourcecode),并将其转换成目标代码(objectcode),再由计算机运行。因为每次执行程序都多了编译的过程,因此效率简单脚本,同样的功能用C或+来编写实现,可能需要两天,而且一般来说,脚本执行的速度已经够快了,快到足以让人忽略它性能上的问题。脚本编程语言的例子有awk、Perl、Python、Ruby与Shell什么时候使用4Shell|ShellUNIXPOSIX的标准化。因此,Shell写”一次,即可应用到很多系统上。因此,之所以要使用Shell脚本是基于:简单性:Shell是一个高级语POSIX所定义的功能,可以做到脚本无须修改开发容易:可以在短时间内完成一个功能强大又妤用的脚本。Shell资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash等等)需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(C+FORTRAN来处理)。有跨平台(操作系统)移植需求(一般使用C或Java)复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)需要产生或操作图形化界面GUII/Osocket私人的、闭源的应用(shell)如果你的应用符合上边的任意一条,那么就考虑一下更强大的语言吧——或许是Perl、Tcl、Python、——或者是更高层次的编译语言比如C/C++,或者是Java。即使如此,你会发现,使用shell来原型开发你的第一个Shell脚本5Shell|sh(shshell),扩展名并不影响脚本执行,见名知意就好,如phpshellphpecho"HelloWorldShell。echo命令用于向test.sh,cdchmodchmodx./test.shPATHtest.sh./test.sh通过这种方式运行bashshell(WindowsExplorer),但我故意写成系统,是方便理shell,/bin/shshell/bin/sh/bin/sh再看一个例子。下面的脚本使用read命令从stdin获取输入并赋值给PERSON变量,最后在stdout#Author:\h#Scriptfollowshere:echo"Whatisyourname?"readPERSONecho"Hello,chmodchmod+xWhatisyourname?Hello,Shell变量:Shell变量的定义、删除变量、只读6Shell:Shell|定义变量时,变量名不加美元符号($),注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:-首个字符必须为字母(a-z,A-Z)。-中间不能有空格,可以使用下划线(_)。-符号。-不能使用bash里的关键字(可用p命令查看保留关键字)。\h\h使用一个定义过的变量,只要在变量名前面加美元符号($)echo$your_nameechoforforskillinAdaCoffeActionJavaskillecho"Iamgoodat$skillScript",$skillScript\h\hecho${myUrl}\hecho${myUrl}\hreadonly命令可以将变量定义为只读变量,只读变量的值不能被改变。\hreadonlymyUrl\h/bin/sh:/bin/sh:NAME:Thisvariableisreadunset变量被删除后不能再次使用;unset\hunsetmyUrlechoshellshellshell变量shellShell特殊变量:Shell$0,$#,$*,$@,$$7Shell:Shell$0$#$*$@$?$$|称为特殊变量。例如,$ShellID,pid,$echo$echo传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2ShellIDShellID运行脚本时传递给脚本的参数称为命令行参数。命令行参数用$n表示,例如,$1表示第一个参数,$2表示第二echo"FileName:echo"FirstParameter:$1"echo"FirstParameter:$2"echo"QuotedValues:$@"echo"QuotedValues:$*"echo"TotalNumberofParameters:$./test.sh$./test.shZaraAliFirstParameter:ZaraSecondParameter:AliQuotedValues:ZaraAliQuotedValues:ZaraTotalNumberofParameters:$*和$@的区别,"$*"$1$2$n"的形式输出所有参下面的例子可以清楚的看到$*和$@echo"\$*="$*echo"\"\$*\"=""$*"echo"\$@="$@echo"printeachparamfrom\$*"forvarin$*echo"$var"echo"printeachparamfrom\$@"forvarin$@echo"$var"forvarin"$*"echo"$var"echo"printeachparamfrom\"\$@\""forvarin"$@"echo"$var"./test.sh"a""b"c""d",$*=a$*=abcd"$*"=abc$@=abcd"$@"=abcprinteachparamfrom$*printeachparamfrom$@abcdprinteachparamfrom"$@"$可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。$./test.sh$./test.shZaraAliFirstParameter:ZaraSecondParameter:AliQuotedValues:ZaraAliQuotedValues:ZaraTotalNumberofParameters:$echo$Shell替换8Shell|如果表达式中包含特殊字符,Shellecho-e"Valueofais$aValueValueofaiseeValueValueofais下面的转义字符都可以用在echo中:退格(删除键换页(FF),水平制表符(tab可以使用echo命令的-E选项禁止转义,默认也是不转义的;使用-nShellcommandEsc键下方。echo"DateisUSERS=`who|wc-echo"LoggedinuserareUP=`date;uptime`echo"Uptimeis$UP"DateDateisThuJul203:59:57MST2009Loggedinuserare1UptimeisThuJul203:59:57MST03:59:57up20days,14:03,1user,loadavg:0.13,0.07,var(unset),word,varvar(unset),word,varwordvar(unset),message量var是否可以被正常赋值。若此替换出现在Shell脚本中,那么脚本将停止运行。varword,varecho"1-Valueofvaris${var}"echo"2-Valueofvaris${var}"unsetecho"3-Valueofvaris$var"echo"4-Valueofvaris$var"echo"5-Valueofvaris${var}"-ValueofvarisVariableisnot-Valueofvaris-ValueofvarisPrefix-ValueofvarisShell运算符:Shell算数运算符、关系运算第第9章Shell运算符:Shell算数运算符、关系运算符、布尔运算符、字符串运算符等|Bash生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。exprval=`expr2+echo"Totalvalue:2+222,这与我们熟悉的大多数编程语言不一样。-完整的表达式要被包含,注意这个字符不是常用的单引号,在Esc键下边。val=`expr$a+$b`echo"a+b:val=`expr$a-$b`echo"a-b:echo"a*b:$val"echo"b/a:val=`expr$b%$a`if[$a==$b]aa+b:30a-b:-b/a:2b%a:0aisnotequalto`expr$a$b`30`expr$a$b`10`expr$a*$b`200`expr$b$a`2`expr$b$a`0a=$bbatrue$a$bfalsetrue$a$btrue运算 说 举[$a==$b$a$bif[$a-eq$b]echo"$a-eq$b:aisnotequaltoif[$a-ne$b]echo"$a-ne$b:aisnotequaltob"echo"$a-ne$b:aisequaltoecho"$a-gt$b:aisgreaterthanb"echo"$a-gt$b:aisnotgreaterthanif[$a-lt$b]echo"$a-lt$b:aisnotlessthanif[$a-ge$b]echo"$a-ge$b:aisgreaterorequaltob"--true$aeq$btrue-true$ane$btrue-true$agt$bfalsetrue-true$age$bfalse-true$ale$btrueechoecho"$a-ge$b:aisnotgreaterorequaltoif[$a-le$b]echo"$a-le$b:aislessorequaltob"echo"$a-le$b:aisnotlessorequalto1010-eq20:aisnotequaltob10-ne20:aisnotequalto10-gt20:aisnotgreaterthanb10-lt20:aislessthanb10-ge20:aisnotgreaterorequaltob10-le20:aislessorequaltob运算 说 举echo"$a!=$b:aisnotequaltob"echo"$a!=$b:aisequaltoif[$a-lt100-a$b-gt15]echo"$a-lt100-a$b-gt15:returnstrue"echo"$a-lt100-a$b-gt15:returnsif[$a-lt100-o$b-gt100]echo"$a-lt100-o$b-gt100:returnstrue"echo"$a-lt100-o$b-gt100:returnsif[$a-lt5-o$b-gt100]echo"$a-lt100-o$b-gt100:returnstrue"echo"$a-lt100-o$b-gt100:returns1010!=20:aisnotequalto1010-lt100-o20-gt100:returns10-lt5-o20-gt100:returnsfalsetrue-truetrue$alt20o$bgt100true-truetrue$a-lt20a$bgt100false运算符说 举echo"$a=$b:aisequaltob"echo"$a=$b:aisnotequaltoecho"$a!=$b:aisnotequaltob"echo"$a!=$b:aisequaltoecho"-z$a:stringlengthiszero"echo"-n$a:stringlengthisnotzero"echo"-n$a:stringlengthisecho"$a:stringisnotempty"true$a$bfalsetrue$a$btrue-检测字符串长度是否为0,为0返回truez$afalse-检测字符串长度是否为0,不为0返回truez$atruetrueabcabc=efg:aisnotequaltobabc:stringisnotempty运算 说 举Unixif[-r$file]echo"Filehasreadaccess"echo"Filedoesnothavereadecho"Filehaswritepermission"echo"Filedoesnothavewriteecho"Filehasexecutepermission"echo"Filedoesnothaveexecuteecho"Thisissepcialif[-d$file]echo"Thisisnotaif[-e$file]echo"FiledoesnotFileFilehasreadaccessFilehaswritepermissionFilehasexecutepermissionFileisanordinaryfileFilesizeiszeroFile 说 举trueb$filefals-ctrueb$filefalstrued$filefals-f检测文件是否是普通文件(既不是目录,也不是设备文件),tf$filetrueSGIDtrueg$filefals-ktruep$filefalsSUIDtrueu$filefals-rtruer$filetrutrue-xtruex$filetru-s检测文件是否为空(文件大小是否大于0),不为空返回trues$filetru检测文件(包括目录)truee$filetruShell注释10Shell|shipawebfrogsipa-buildetaoiosapp14ipa#应用名,确保和Xcode里Product下的target_name.app名字一致力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。Shell字符串11Shell|shell(除了数字和字符串,也没啥其它类型好用了),字符串可以用PHP类似。str='thisisastr='thisisastr="Hello,Iknowstr="Hello,Iknowyourare\"$your_name\"!greeting="hello,"$your_name"!"greeting_1="hello,greeting="hello,"$your_name"!"greeting_1="hello,${your_name}!"echo$greetingecho${#stringecho${#stringstring="alibabaisagreatstring="alibabaisagreatcompany"echo`exprindex"$string"is`Shell数组:shell12Shell:shell|Shell在编程方面比Windowsbash(不支持多维数组),C0开始编Shellarray_name=(value1...array_name=(value1...array_name=(value0array_name=(value0value1value2echo"FirstIndex:${NAME[0]}"echo"SecondIndex:${NAME[1]}"FirstIndex:ZaraSecondIndex:Qadir使用@或*echoecho"FirstMethod:${NAME[*]}"echo"SecondMethod:${NAME[@]}"FirstMethod:ZaraQadirMahnazAyanDaisyShellecho命令13Shellecho|echoShellechoecho您可以使用echo"It"Itisaecho"$nameItecho"$nameItisaOKOKItisa如果变量与其它字符相连的话,需要使用大括号({echo"${mouth}-1-8-1-8-1-echo"OK!\n"echo"Itecho"OK!\n"echo"Itisatest"Itisaecho"OK!\c"echo"Itecho"OK!\c"echo"Itisatest"若需要原样输出字符串(不进行转义),echoechoechoechoShellprintf14Shellprintf|注意:printfPOSIXechoecho,printfHello,ShellHello,Shellformat-string为格式控制字符串,arguments为参数列表。Cprintf()printfformat-string上,单引号双引号均可。-参数多于格式控制符(%)时,format-string可以重用,可以将所有参数都转换。-argumentsformat-string$printf"%d%s\n"1"abc"1abc$printf'%d%s\n'1"abc"1abc,format-string$printf"%s%s%s\n"abcdefghijabcand0%d的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为-bash:printf:Shell:invalidThefirstprogramalwaysprints注意,根据POSIX标准,浮点格式%e、%E、%f、%g与%G是“不需要被支持”。这是因为k支持浮点预算,且有它自己的f语句。这样l程序中需要将浮点数值进行格式化的打印时,可使用小型的k程序实现。然而,内建于3和zsh中的f命令都支持浮点格式。Shellifelse语句15Shellifelse|if语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shellifelseiffiiif...else语句ifelseifif[expression]Statement(s)tobeexecutedifexpressionisexpressiontrue,thenfalse,不会执行任何语句。fiif,fiif倒过来拼写,后面也会遇见。if[$a==$b]aaisnotequaltoif...else...fi语句ifelsefiif[expression]Statement(s)toif[expression]Statement(s)tobeexecutedifexpressionistrueStatement(s)tobeexecutedifexpressionisnotif[$a==$b]aaisnotequaltoifeliffiifif[expression1]Statement(s)tobeexecutedifexpression1istrueelif[expression2]Statement(s)tobeexecutedifexpression2istrueelif[expression3]Statement(s)tobeexecutedifexpression3istrueStatement(s)tobeexecutedifnoexpressionisexpressiontrue,expressionfalse,那么不执行任何语if[$a==$b]elif[$a-gt$b]elif[$a-lt$b]echo"Noneoftheconditionaaislessthanif...elseifelsetestiftest$[num1]-eq$[num2]echo'Thetwonumbersareequal!'echo'ThetwonumbersarenotTheThetwonumbersareShellcaseesac语句16Shellcaseesac|caseesacswitchcasecase语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:casecasein模式case工作方式如上所示。取值后面必须为关键字in,每一模式必须以右括号结束。取值可以为变量或常数。匹配breakcase模式,使用星号*捕获该值,再执行后面的命令。下面的脚本提示输入1到4,echoecho'Inputanumberbetween1to4'echo'Yournumberis:\c'readaNumecho'Youselectecho'Youselectecho'Youselectecho'Youselect*)echo'Youdonotselectanumberbetween1toInputInputanumberbetween1to4Yournumberis:3Youselectcase${option}-f)-d)echo"Dirnameisecho"`basename${0}`:usage:[-ffile]|[-dexit1#Commandtocomeoutoftheprogramwithstatustest.sh:usage:[-ffilename]|[-ddirectory$./test.sh-f$viFilenameisindex.htmDirnameisunixShellfor循环17Shellfor|for列表是一组值(数字、字符串等)变量。forforloopin12345echo"Thevalueis:$loop"Thevalueis:forforstrin'Thisisastring'.bashforFILEin$HOME/.bash*Shellwhile循环18Shellwhile|whilewhilewhilecommandStatement(s)tobeexecutedifcommandistruewhileCOUNTER5,true。COUNTER0开while[$COUNTER-lt5]echo$COUNTERwhile循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,echoecho'type<CTRL-D>toterminate'echo-n'enteryourmostlikedfilm:'whilereadFILMecho"Yeah!greatfilmthe$FILM"typetype<CTRL-D>toYeah!greatfilmtheSoundofMusicShelluntil19Shelluntil|until,untiluntiluntilcommandStatement(s)tobeexecuteduntiluntilcommandStatement(s)tobeexecuteduntilcommandistrueuntil[!$a-lt10]echo$aShellbreak和continue命令20Shellbreakcontinue|在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shellbreakcontinuebreak命令break命令允许跳出所有循环(终止执行后面的所有循环)下面的例子中,脚本进入死循环直至用户输入数字大于5shellbreakwhileecho-n"Inputanumberbetween1to5:"readaNumcase$aNum*)echo"Youdonotselectanumberbetween1to5,gameisover!"在嵌套循环中,breakbreaknnvar12,var20,forvar2in05if[$var1-eq2-a$var2-eq0]break2echo"$var1如上,break2continuecontinuebreakwhileecho-n"Inputanumberbetween1to5:"readaNumcase$aNum*)echo"Youdonotselectanumberbetween1to5!"echo"Gameis运行代码发现,当输入大于5echo"Gameisover!同样,continuecontinueNUMS="123456Q=`expr$NUM%2`if[$Q-eq0]echo"Numberisanevennumber!!"Numberisanevennumber!!FoundoddnumberNumberisanevennumber!!FoundoddnumberNumberisanevennumber!!FoundoddnumberShell函数:Shell函数返回值、删除函数、在终21Shell:Shell|ll函数必须先定义后使用。function_namefunction_name(){listofcommands[returnvalue]functionfunctionfunction_name(){listofcommands[returnvaluereturnShell,0return他数据,比如一个字符串,往往会得到错误提示:“numericargumentrequired”。个变量来获得函数返回值。#DefineyourfunctionhereHello(){\hHelloWorldreturnecho"Thefunctionistogetthesumoftwonumbers..."echo-n"Inputfirstnumber:"readecho-n"Inputanothernumber:"readanotherNumecho"Thetwonumbersare$aNumand$anotherNum!"return$(($aNum+$anotherNum))#CapturevaluereturndbylastInputfirstnumber:25Inputanothernumber:Thetwonumbersare25and50!Thesumoftwonumbersis75!#Callingonefunctionfromanothernumber_one(){\hnumber_two()echo"Url_2is\h\h\hunsetfShell22Shell|Shell$n,$1echo"Thevalueofthefirstparameteris$1!"echo"Thevalueofthesecondparameteris$2!"echo"Thevalueofthetenthparameteris$10!"echo"Thevalueofthetenthparameteris${10}!"echo"Thevalueoftheeleventhparameteris${11!"echo"Theamountoftheparametersis$!"echo"Thestringoftheparametersis$*funWithParam12345678934Theva

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论