2024年shell高级编程经典教程.docx
非正常退出时的文件恢复:1.非正常退出后再次登录执行Vim/心时.会出现这样的界面提示:卜:依:往发我交帙Nft.e.Efa*:mottiW:Se1.Ort91,:3:57201.f文件名;A«»tMet,n刖户名:rx>>tr.:Rinyintatao电NIDi4BS9-S.*Iftt.KR:SetOctIOO1.29:472010it女执文杵析I(t三11retftiWMttiv½ii>rfi*A仔-r文忤产:阚个(、网内!本ti.或卜心越则馈<2>i.,8MRtrtzmt*tt1.ii4W”“、”*«««.t*,RMMiSmtJ1.4IW'Wtt''he1.pr<o>erv")«BNrQfMnTKS.ORtMXn7.tet.m(V1.*W0K1.itMU灾文件7.1et.w*ae*tt11.)1./-晨】MIJC,CUiMI,SUQ(YI“丁玲;”E323:注息交换文件.tc,c.pMa<:FCWtHM:SMOrt913:M:S720IC文件61.c¼1.修改过,S用户名:11×>t三班名:mnyt<atao选IDt48592 .执行vim-rtest后再次执行vim"est时,出现下面的提示界面:iE三I*Xf*,t<t-日照:SatOCt1«01;2»:“2010比交擅文件所!_1.i3 .未删除iestswp文件时.即使恢复了文件仍然提示.恢复并删除才算完成:环境变量:1.<7M注口.if所口考:mMfew:SrtOr1.9U:S4:57z1.fIrttinyt11cato仔naw-Iinux:rtnnyngatao.)RIinuxechoSnaneIt-i(roo1.Minyt11ntao*IanHnuxechoInSnaaet.gIrootf!tnyIngatao*Pecho*i«nSnaae.jh",1an1.in5c.Jhr<x>tnnyngn1.a0.产echoIartS11Mep"IIrcx)1.Mtnynga1.ao"1anIinux.Jhecho*IenSnMe.jherc)ttinyingatao”产echo*1MSnae)Jh,Icut1.nu.JhIrv1.funyitao'ccbv1onSnaecIanSnftnCIrtnnyingatao后echo.IonSnaocjh'Ian(!tnuxhjhrootn:nyincn1.ao护un*c1.Mncrtntnyt11ntao*IrtMtnyt11fiHto、卜echoSmhc己-旨呈模+苻妇瞿拣成字母Sw金InUjIroot三n)i11tao卞echoSnItnux一,Irooietn>twi3*ocho*1MSnar*IMItnuM*皆IrCXninyi11gntAecho,IMSnAX.jh1IanHnr.jhrootn>i八“13卞echo!amSnacpCM>tM1.11)I1.1.XntS.echoIanSnaX.jh*IM11uxjh!rootin>ingota'->*三echo*IamSmJ.Jh,Ian1mux.JbIr-n>MMUcj*echo,!MSaIanSCMnCroomn)ngtaMecho*Ian(Snanc.jh*IM!tnuxjhrc)ttn>i11gnt>7unsetMf1.rrt)ngnt卞echoSnMr”号fMt不Iroot三2nytnfttat>卞rtngr叩(基本型参数:匹配行首$匹配行尾.匹配单字符*在正则表达式中表示匹配=O个前面出现的字符.而在bash中*表示=0个任意字符U里面可以写很多.但是值匹配一个.如果都找到呢.就都输出来转义符.如、S表示以结尾grep-V12:'sharcMatc在/Jiharbdatc中找不含12的行.只要有12的行就不显示。但是grep'八2】YsharM1.ate表示非2的的都可以显示,如果这一行的内容只有23,那么3是符合条件的,仍然显示这一行。区别很微妙,操作一下就明白了殁空行八.5只有3个字符的行,*$匹配行中任意字符产用的非常多的.匹配任意个任意种类的字符(即=()个.比如找到am和bin之间有任意多个任意字符时,用'am."bm:可以找到找到ainbm.amhbm,amfsbm总之am与bm之间有=0个字符就是了。另外am和bm之间有任意多个字符。时.用'amo*bm,(不是amo.*bm哦,可以找到ambm.amobm.amoobm,amooobn如果是在h和g之间有至少2个。呢,就是100o*g找到hoog,hxxg,fbooog有点小啰嗦-i不区分大小写,如-iFW就可以找到不区分大小写的theoab)既然功能相似就一起吧.这个表示匹配的次数.如果在h和g之间有2个。就是'ho2g'.如果至少2就是%o2g',如果是2到5个呢.就是'ho25g'啦IIiNn1.大写或小写i或n.但是UiMNn只能找到i和n.为什么.下图。I17:26:24rootMnyIngtao*JgrcpharctcstIJtbnbah2三bioII7:26:40rocKKunyingtoo*Urcp'I11Xshrctcst1.!iba>h2:/bin9:i1.O:nU:!12:XP9a-zA-Z非数字且非字母grep*120-3VshareZdate找含120或或122或123,都存在呢,就都显示出来呗grep,AA1.2J7share.'date查找开头不是12的行grepSstep,ftStep或stepgrep-E1.41591'sharehes1.找134或159.用管道符号时必须加E.因为grep是基本型的.如果是延伸型的egrep就不用加E啦,所以只用grep1341597ShareJ'test会找不到C但是为什么用CgrCP134I159'/ShaPtCSt找到了.却没有行号和颜色呢,因为提前已经在Ybashrc设置好了a1.iasgrep=1grep-n-co1.or=auto',加入这条语句后执行source.bashrc重启终端生效.或者关掉终端再打开。16:52:10rootofinyngto'grep1341133*hActct(!6:55:013:134root6cinytngtoo'Itrcp-E,134I33,Bharetcst16;55:133:154r<x)tf11o)inEtao""ep-E134|159,/sharetetCgrCP(延伸性CgrCP是grep的延伸,它有更多的功能,主要表现在上面提到的管道符号上,另外还有一些如果想去掉以#开头的注释行和空白行,用基本型grep表示为grep_、,"#,shareestgrep-V用延伸型的egrep表示为egrep-vIA$',S1.Jarej'test这样看区别很明显吧”go,.,dg和d之间有。个或1个o.即gd或godgo+d'g和d之间有=1个o.即god或good或goood,go*d'g和d之间有=0个。.即gd或god或good或goood,go.d'go和d之间有=0个任意字符,即god或gohd或gostd'g(oo1.ad'找good或g1.ad,注意grep中用(.而grep用'A(xyz+W,找开头是A结尾是W,中间有=1个字符串xyz,如xyz,XyzXyZ例如执行CCho,AxyzxyzxjrzxyzV,egrep1A(xyz÷W,Sed:查找工具.查找或替换一个文件中的指定行是面向行的操作,但是用字符串替换命令却可以直接对行中的字符串替换.(如果就爱了个指定字符串替换为空就糊掉了所以Sed可以插入.删除行.也可以插入,删除字符串。但是不会对原文件修改.只是将结果检出参数:a在指定行的后面插入一行i在指定行的前面插入一行(如果插入几行呢,就在各行之间用换行符Xnd删除指定的一行或几行P在屏常列出指定的一行或几行,常与-n配合使用C面向行的操作,替代一行或几行(将几行替代为一行或将一行替代为几行都可以SedNthi朝hat©替换字符串命令将this替换为Iha1.是面向指定行中的指定字符串的操作。有了它Sed变得更强大了.它将sed的行操作扩展到行中的字符串.可以插入、替换或删除字符串,和vim中命令行模式下的SSm1.iSthatg类似,但是更好用。-i直接修改文档内容而不输出,慎用。如:Wd-i八!信可将每行末尾的.替换为!(和!都加了转义符。注意这个-i和上面的i有所不同。例子:下面的4个小技巧是在文档sed.txt中操作的:Sed2,Sd'sed.txt删除第二行到最后一行Sed'Sd,sed.txt删除最后一行如果有一行内容为aisb那么怎么来插入和删除呢Sed,sisisfro11Vg,就插入了from了变成aisfrombSed*i"g'就删除is了.变成abQjn1.etcpasswdSed,2ahe1.1.1.onjim,将he1.1.o和jim两行插入到第二行的后面.注意he1.1.1.o和jim之间加了换行符H哦12:54:10root<vnyingtao')n1.etcpass*dSed'2ahe1.1Io11JteIroot:x:0:0:rootr/root!btn/bath-2btn:x!1:1!bin!/bini/sbin/no1.otnhe1.1.1.o3daeaon:x:2:2:dMBon:/sbin:/sbin/!X)1.oein将a替换为i就是插入到第二行的前面12:54:10root<三inyingtao*1.n1./etcpass*dsed'2ahe1.1.1.o11Jia1root:x:0:0:roott/root:btnhh-2btn:x:1:1!btnsbntbin/no1.ogtnhe1.1.1.oetcpasswdSed,2.5d,删除2.3.4.5行n1.etcpasswdSed-n,5,7p'在屏幕输出5.6.7行,与-n一起用112:54:10rooKninyingtao'n1./etc/passwdSed'2ahe1.1.IonJia1 root:x:0:0:root:/root:b<n/bath-2 btn!I:1.tbin:/bint/sbin/no1.o(inhe1.1.IonI/etc,PaSSWdSCd2,30chc1.1.1.o5jim'将2到30行换为hc1.1.1.o和jim两行12:53:56rootn<n>ingtao'n1.etcpaBsdsod*2t30che1.1.1.onIroot:x:0:OirOOt:/roQt:/b,/bashhc1.1.1.oJiB31apochc:x:48:48:pcchejv*wwjsbnr>1.Ogtn32distcche:DiStCXhe:/:tH>no1.ogin/SbiiVifconfigCthOgrcp,inctaddr'可找到含inctaddr:的行。bin,ifcongethgrep,inetaddr,Wd,.*addrg,sed,S'1.Bcast.*Sg'先将ad<1.r:及前面的内容换为空(即删除,再将BCa“后面的内容换为空(删除,结果呢,这一行就只剩192J68010了.这就是替换的强大之处.如下图(如果将指定字符串替换为其他呢(12:53:56rootnin>irgtAo'n1.etcpa»sdSed,2,30che1.1.1.onIrt三x三0三0三root三root三nboshhc1.1.1.oJ1.B31epachc;UH;48:pech<s>arm:stHn111.cin©catetc,nan.configgrep'MANSed,s.g'sed's/W/g,用grep找到含MAN的行.再在其中将以#开头的注释行换为空行.再将空行删除.(注意是换为空行,所以原来的注祥行蛋然内容没有了,但是行还在,也就是出现了许多空行,所以后面才删除空行其中以#开头的注释行除了用M产表示,也可以用#产$表7Fo12:53:56rootninyirgtM'n1.ctcpa!dSed*2,30che!11.onIroo1.:x:0:0:n>o1.:/rgt:/n/ba5h上面的方法虽然能涉及更多的知识点.却很繁琐.不如直接将以#开头的注释行删除.命令为:catctc,man.confggrep,MAN,SCd7A#.*/d,d表示删除,以#开头的注释行用/#.*/表示,注意加两个,哦awk:以行为单位.面向列的处理工具。NhNowFie1.d每一行的列数(字段数NR:NowRow目前awk处理的是第几行FS:string分隔符.不设置则默认是空格逻辑符号:>v=>=<=!=例子:(Hast-n5Iawktrint$1*t',S3'先列出前5行.再打印输出第一和第三列,并用tab分隔(2catctcpasswdawkBEGINFS='Y,S3<IOprintSIN'$3'如果第三列值小于IO就将第I和第3列输出,加BEGIN使分隔符:在第一列就生效,否则在第二列生效且从第二列开始输出(31as【-n5awk,printS1.-t1.ines:NR'%CO1.UmeS丁NF'执行结果为:root1.ines:1co1.unes:1()root1.ines:2co1.unes:1()nower1.ines:3co1.umes:1()(4Catminyingtao.txtawk,NR=1Jprintf,%i0s%10s%1.0s%i0s%10sn,.S1.S2,$3.54.,'Tota!NR>=2tota1.=$2+$3+$4;printf%IOs%IOd%10d%10d%10.2fn'S1.S2,S3,S4.tota1.,执行结果为:NamefirstsecondthirdTota1.Jim10203060.Torn1236.00Jim52411.00原文件为:NamerstsecondthirdJim102030TomI23Jim524格式:awk,条件”动作1条件2动作2,文件名注意:所有条件和动作在华引号中primf中的内容用双引号而不是单引号.变量值不加双引号.多个动作用分号隔开修改登录she1.1.方法一:永久修改。在/etc,PaSWd中将smb用户的SheI1.由bash该为csh.然后切到smb用户.用echoSvcrsion查看,发现已经改为ICSh,如下图:8eb:x:500:500:/hone/s«ib:/btn/csh!¾SSOI:50!:/homedcnnyin/hn、hinnte;、:502:5O2:/home/arme:/bin/bas-.(rootain>>ingtAc*hrcaVActcps>*ad(rooxBin>ansta<Qre)tus>MUt:oonan)arcvaonti.>irtrgt0careSXhO>rcion;<.hib.14.00(V(s,COg03二i:Mkiin:。Inab)upM9ik1.d,.kn.h.1.j方法二:永久修改。直接执行ChSh(即changeShd1.,然后写下想要的she1.1.类型,再执行Chsh时可以看见已经改了,下图:ICOOtSaIn>,Intacfthrcvict<>ft*vd(riMinnctacshrca$us>setcft¾:Tocnans“cgn1.B.1f<iryret»<frarSechotersonI1.S.H.00(.Ooi0311IiBuin.c1.!1.f4)puM*Jcn1.*.d1.Ikanrh.o1.cshe1.1./bin/bah1.:inAh下面的所有test文件都需要修改权限才能执行:ChmOd+x文件名TesK):#!/bin/bash#testecho-e"this31.inesnnn"echo-ok"echo"enteryourname:n"就这一行的输出前面没有加参数-e.所以不能换行.换行命令n被输出readnanwecho-e"enteryourpasswdn"readpasswdecho"name:$rIamC.passwd:$PaSSWd”边阡第输出前面及H81故.所以不能帙忏恢忏命令、d-wvwUN1M.-NMTV.达厅於输出前面&H3ft.所以不服帙斤挨忏伪_MMCfIIMIMB.KI.3WJW一一二一(rootrinyi11gatao三?、i./test(root*inyIngto.tctIhiS31ineTesiI:#!/bin.'bashMeStImj'var=8()echo-theva1.ueofvaris:Smyvar"echo'theva1.ueofvarisrSnyvar,Test2:#!/bin/bash*tcst2forcharinabcdcdoechoSchardonerootMi11)ingtaoJ三ChBDdrtct2roo1.<9tnytngtostcst2Test3:#!Zbirvbash#test3forcharin(1.5)echoSchardoneroctMinyng1.AG*-ChB)1.XJrtet2rootMtnyinctaojs.tcst2Tes(4:#!/bin/bash#tes(4orcharin'Ishojc'(可以写成$0s+<>mc和用反单引号写成的'Is小<>mc'都是执行Is/home命令doechoSchardoneest5:#!/bin/bash#test5i=0whi1.e$i-It5doecho,v1.ueofiis:Si”i=S(Si+1.(可写为i='ecpr$i+注意反向单引号donerootnyngtoJ三anmedcnn)info1.esrootff1.inyingtao/*./tcstoaIueofiis:OaIueofiis:Ia1.ucofiis:2a1.cofiis:3aIucoiis:4Test6:!bin1>ashMteSI5echo$2echo$3(前两行是注粹,只为增加可读性.可以修改.数字只能是1到9roofmin、NngtaO*./tcstSaIueofiis:OaIueofiis:1aIuvofiIS:2a1.ueofiis:3root*oinyIngtao/三./tcstSa1.cofiis:Oa1.ueofit:IaIucQfi1.S:2a1.ueofiis:3aIucofiis:4Test7:#!/bin/bash#tcst7read1.istforvarinS1.istecho$vardoneroadIiStorvarinroot<minyingtao三./test7!23J56he1.1.o!三STes(8:#!/bin/bash#tes(8nax=()echo"pIeaseinputnumberf'read1.istforvarinS1.istdoifIvar-gt$maxthenmax=$varfidoneecho"maxnumberis:$niaxecho"i'1ivud1.istioiarindoifSvargtSnn.-.,JthenttU三SVU!*idoneIochoechopI<rc.J1.istI'varinIdQif1.kv1.i1.thenfti=、tm1idoneTes(9:#!/bin/bash#test9echo''p1.easeinputnumber:n"readactua1.ifSactua1.-ge0aSactua1.-It80thenecho"yourgradeisC!”e1.ifISactua1.-ge80-aSactua1.-It90)thenecho,yourgradeisB!''c1.ifISactua1.-gc90-aSactua1.-Ic100thenecho,yourgradeisA!”e1.seecho-c,'yournumberiswrong!np1.cascinputnextnumbcr:n"I1.3ochoireadactua1.5ifIs11vIua1.Fe-aSactua1.-ItI6then7echow.4readactua1.5ifIShCja1.-ge-a11ctu'-116thenTest1.O:#!/bin/bash#test1.Oecho-e"p1.easeinputyourchoicen"readchoicecase$ChoieCinICChO-yourchoiceisA"2 echo-yorchoiceisB"3 echo"yourchoiceisC"4 echo-yourchoiceisD":5 echo-yourchoiceisE"*echo"yourchoiceiswn)ng!"esacR1./bin/bash1.tteUOechoreadchoicecasekho1.cein1) echo”;2) echo"-''3) echo',";4) echo'''5) echom<.)echo"esoHt酩Ipcho"1.ike.1,.:Xn"readchoiceKaSekhocein1) echo""2) echo".";8)echo''-'';4) echo'',;5) echo“Test1.k#!/bin/bash#tcst11echo-c"p1.easeinputinformation:nStudentname:"readnameecho-c"Emai1.Adddrcss:',reademai1.echo-c"Te1.ephonenumber"readte1.echo-e"S1.udcn1.naine:$namenEmai1.Adddress:$emai1.nTe1.ephonenumber:$te1.nn»ccKho*:1»?,IricI>:n"!:*!(rf<,eod11arwKh'-1.*r,eIi<J.<;.'*raoJemiIKno,Tw1.<*0":reedte1.BCho-"tudmtn11ectnaner11BISg11biir-4t1.n,则文件CC的内容更新为:I1.!/Dirybaih:h*:IFJ';.,;!»:11I.»<,MdnoneKho1.,rI,.I.:MreaierraiIBChO'i<r0dtoIho-h,itn119f>miI:1.oam1.rmt>3to1.n,Studentname:nunyinqtao廿曲”()*执行界面:(rataIny1.ng但v2r./test11p1.easeinputnforrmt<n:Studentrv>11e!m11yngto>Eg1.IA±k1.ress!970177451Te1.ephcnenuntoer:134756944Test12:#!XbivbashWtest12echo-Thenameofthisprograneis$0"echo"Therearctota1.1.y$#PanUnCtCrSpassedtothisprogramc"echo"Theparametersarc$*echoTheresu1.tis$?"可以用bashfi1.ename来执行文件:root®«nyngtass1.varet./t&st1.1.p1.easeinputInforrrti<n:Studentrtanw:m11yingtaoEraiIAiddress:370177451reotnr>yngta5ar>tst1.1.p1.easeinputforrrt<n:Studentnacre:mnyingtooEg1.s:Test13:#!/bin,bashMtest13iftestS#-eqOthenecho"Youshou1.dspecifyafi1.e!"e1.segzipSmvS1.gzSHOMEZdustbinecho-e"Fi1.eS1.isde1.etedtothedustbinnyoucanpickitupasyou1.ike."fi这是一个简单的把文件删除到垃圾箱的脚本,垃圾箱就是用户目录下的一个dustbin目录JSHOME可以通配所有的用户目录,即在smb用户的时候相当于horne111b0脚本有问题,当不存在文件时,仍然会执行e1.se下的命令并输出最后一行的提示,这是因为判断条件不合理SkeqO表示自行脚本时文件名后的字符不为空就执行e1.se语句.BfBbhBtest13If-eqUC1.U*Y1.MitUIdpC1.11e1.egzipw匕*d*3tbinBtzbiBzbesh3Htest-r<Hecho*Y*1.trgzipTest14:!binbash#test14foriinSHOMEZdustbin/*.gzdorm-f$iecho-$ihasbeende1.etedforever!"done这是一个把垃圾箱里的文件彻底删除的脚本Itcst1.1.oriin/dustbin/*.gzdor-fecho'h<sbeend匕I1.I1.jfrevtr!,t,八inbshitest14oriin/dustbin/".g乙doMfTest15:#!/birvbash#tcst15functiontest15(re=Onun=Owhi1.e(Snum-It1()#或写Whi1.eSnum-Ii10donum="exprSnuin+re=expr$re+Snum'donereturn$numtcst1.5echonum=Snm-echo"resu1.t=$rc"这段脚本实现+2+10,可以不用功能函数实现t1IIeSt.15whi1.e1.es1.io.Irtest1.5Test16:!binbash#test8echo"P1.easeinputanumber:"readnumn=1.whi1.eSn-Ie$numdoi=1.whi1.e($i-IeSndoprintf"*"i=S(Si+1.donePrintfMn=$($n+1done(20:422Trootanyin(taQ/sharetcst8P1.easeinputaMJfIber:842:52roo1.inyi11c1.oo/share)把*改为Si:|20:42:27rtainyintoc/share./tc»t8P1.easeinputanumber:8.把*改为Sn121:33:12rt<mnyinto/shore.h1.P1.easeinputanucbcx':1223334444wOOOOTest17:这是一个备份文件的脚本:!bin1,bash*tes1.7:aScriptsofbackfi1.es(运行时在后面输入要备份的文件1.OG_STARTJnME='da1.e+-%Y%m%d%H%M%S"'#时间格式,是写在备份日志文件名和日志里面的BCKUP,DIR=Zsharezbackup#备份目录.是备份文件的存放位置BCKUI1.OG='SBCKUID1.RS(1.,START.TIME).1.og-#备份日志.是备份目录下的一个以时间为名称后缀为Jog的文本functionwritc-1.og(1.og_iin»e='date+"%Y-%m-%d-%H-%M-%S"'#时间格式,是输出到屏幕上的backup_fi1.e_name=S2#执行脚本时在命令行输入J心117testtestItes1.2ICS1.3test4其中八est1.7的位置是$1.te”的位置是$2.test1.的位置是S3.脚本执行时是一个一个的备份的.当位置$2的IeSt备份完后.$3上的test1.向左移动到$2的位置.这时S2位置不再是test而变成test1.所以脚本中用$2来表示其实是一种循环.每备份一个文件就输出到屏幕一次并写一个备份日志,然后在备份$2位置上新的文件,直到完成所有备份循环才结束,所以看到屏常上输出备份结果时,两个输出之间会有一个短暂的停顿,因为备份每一个文件都需要一个短暂的时间。err-nsg="$Iog_timeERRORinbackupfHe/direciory(Sbackiip_fi1.e_namu''#备份出错时的打印输出suc_msg="$1.og_(imeSUCCESSinbackupfi1.e/director)'(Sbackup_fi1.enan)e"#备份成功时的打印输出ifS1.-eq0|:thenecho$suc_msgecho$suc_msg»$BACKUP_1.OGe1.seecho$crr_msgecho$crr_msg»$BACKUP_1.OGfifunctionbackup_fi1.e(cp-rf$1.$BACKUP_DIR>devnu1.1.2>Siwrite_1.og$?$1functioncreaie_1.og_fi1.e(if!-e$BAcKU1.1.D1.Rthenmkdir$BAeKUP_DIRfiif-c$BACKUP_1.OGRhenrm-f$BACKUP_1.oGfitouch$BACKUP_1.oGc1.ear#脚本执行时先清屏再检出echo"BackupPrOCCSSBeginscreate#调用函数forfi1.ein$*#或写Sdbackup-fi1.eSfi1.eecho"BackupProcejwEnds!"执行脚本之前/share的内容:fhRre-OXDtest4test"文件<E)漏播面看Mf2三<E)sKfa)OIeStIDshare3H«馀空间:89GB执行下面的命令:.share-DX文件0溺纨1.<v>1三<e)*m<a>执行后的界面如下,注意目录小<>mc不能被备份:文件<E)编辑<E)5(V>f2三<>神助目test1.test4test1.7执行脚本后的/share目录有一个backup文件夹.且里面有:两个文件和一个以时间命名的日志:31nowcr365制作