1、精品第二章精品第二章 Shell 足本编程足本编程本章参考教材nUnix技术大全系统管理员卷机械工业出版社nLinux与Unix Shell编程指南机械工业出版社nAdvanced Bash Scripting Guide,by Mendel Cooper,电子书籍n其他网上资源文件安全与权限n文件权限位n-rw-r-rn文件属主权限n同组用户权限n其他用户权限n文件类型:nd,l,s,b,c,p,-文件安全与权限n改变权限位符号模式nchmod u+x file1nu,g,o,an+,-,=nx,r,w,s,t,ln例子nchmod u+x o-w myfile文件安全与权限n改变权限位绝对
2、模式nchmod R 664/usr/local/home/*文件安全与权限n目录的权限nr:可以列出该目录中的文件nw:可在该目录中创建或删除文件nx:可搜索或进入该目录n例如:同组用户对某一目录的权限位为-x,可否执行该目录下设置执行位的脚本?文件安全与权限n目录的权限n目录的权限覆盖该目录中文件的权限drwx r-r-dir1该目录下文件f1权限为-rwxrwxrwx f1则同组用户无法编辑该文件或访问该目录(Bourne Shell)文件安全与权限nsuid/guidn设置suid/guidnchmod 4755 f2n第一个为4:设置suid 2:设置guid 6:同时设置suid和
3、guid文件安全与权限nchown和chgrp:改变文件的属主和属组nchown一般形式nchown-R-h owner filen例子:nchown pauline projectnchgrp admin projectn注:改变文件的所有权时,相应的suid、guid被清除文件安全与权限n查看umask值:umask命令umask值目录文件022755644027750640002775664006771660007770660文件安全与权限n软链接和硬链接nln-s sourcefile destfilen可以用ln命令为文件建立其他的名字find和xargsnfind pathname
4、 options-print-exec-oknfind.maxdepth 1 name“t*”printnfind -name“A-Z*”printn-namen-permn-type:b,d,c,p,l,fn-usern-groupn-mtime n+nn-follown-newer file1!newer file2n-size+nc nc ncfind和xargsnfind.-name leap-prune -o -name t*printnfind.name“a-za-z0-90-9.txt”printnfind.perm 755 printnfind/etc user uucp pr
5、intnfind/-mtime 5 printnfind/var/adm mtime+3 printnfind.-newer chp7_10.sh!-newer hello.sh-printntouch t 09170000 idlefind.newer idle-printfind和xargsnfind/etc type d printnfind.size+10 printnfind/-name“CON.FILE”depth printnfind.type f exec ls l ;nfind.type f name“cw*”ok ls l ;nfind.name“*.log”mtime+5
6、 ok rm ;find和xargsnfind命令中-exec选项,容易导致:n参数列太长n进程过多,性能下降nfind命令与xargs命令结合n分批处理find命令传出的参数nxargs命令只有一个进程find和xargsnfind/name“core”print|xargs /tmp/core.lognfind/apps/audit perm 0777|xargs chmod go-wnfind/-type f print|xargs grep“device”nfind.name*-type f print|xargs grep“DBO”后台执行命令n设置crontab文件,用它来提交作业
7、(cron)n用at命令提交作业(at)n在后台提交作业(&)n用nohup命令提交作业(nohup)后台执行命令cron和crontabncron:系统调度进程,自动调度用户的作业ncrontab:允许用户提交、编辑或删除相应的作业n用户能否拥有crontab文件,通过ncron.denyncron.allow 来管理后台执行命令cron和crontabncrontab文件六个域n分:159n时:023n日:131n月:112n星期:06n要运行的命令n域之间用空格分割,每个域可有-、,、*后台执行命令cron和crontabncrontab文件例子:30 21*/apps/bin/clea
8、nup.sh45 4 1,10,22*/apps/bin/backup.sh10 1*6,0/bin/find name“core”exec rm ;0,30 18-23*/aaps/bin/dbcheck.shn注:运行的命令或脚本绝对路径的形式,并在脚本中设置相应的环境变量crontab命令ncrontab-u user e l rn用编辑器创建文件cwcron,每1小时提醒时间(如何写?)ncrontab cwcron将此作业提交给cron进程ncrontab l/crontab e/crontab rn进行备份at命令n向cron守护进程提交作业,稍后运行n为提交的作业保留当前环境变量
9、,包括路径,作业的输出发送电子邮件(或重定向)nat-f script-m l r time daten命令行方式或者at命令提示符at命令n$at 21:30nat find/-name“passwd”printnat n系统返回Job ID:job 1n从邮件中获得结果信息at命令n接受的日期/时间格式:nH、HH.MM、HH:MM、H:M、am、pmnat 6.45am May 12nat 11.10pmnat now+1 hournat 9am tomorrownat 15:00 May 24nat now+10 minutesat命令natq命令或at l命令n$at l n2200
10、3-09-02 23:00 an32003-09-22 13:20 an42003-09-03 09:00 an12003-09-03 12:00 anatq c,atq nat命令n清除作业n先执行at l命令,获得作业标识n再使用at r清除该作业&命令n将费时的作业放至后台运行,系统返回进程号n完成时,按任一键出现完成提示n将输出重定向n查看进程ps nohup命令n使后台进程在用户退出登录时继续运行n作业的输入输出重定向到nohup.out中nnohup command&n可通过提交脚本一次提交多个命令Shell输入与输出n标准输入n标准输出n标准错误输出n输入输出的重定向Shell输
11、入与输出necho命令n显示文本或变量necho hello worldnecho“hello world”necho hello worldnvar=“hello world”echo$varecho“$var”echo$varnecho“007”necho e“007”necho$007n转义n,r,t,v,b,a0 xx(八进制)echo5_2.shecho$variable01 echo echo Hello,he said.Shell输入与输出n转义nvariable=echo$variable nvariable=23skidoo echo$variable nvariable=e
12、cho$variable nvariable=echo$variable n的转义作用Shell输入与输出necho命令necho“something”myfilenecho“something”myfilenecho“now is date”Shell输入与输出nread命令n从键盘或文件的某一行文本中读入,并赋予一个变量nread nameHello how are younread name surnameJohn Doenread name surnameJohn Lemon Doen参看例子脚本ntest.shShell输入与输出ncat命令n显示文件内容、创建文件、显示控制字符nc
13、at myfilencat v myfile(-v显示控制字符,M)n用cat命令创建新文件ncat myfilen管道命令(|):把一个命令的输出传递给另一个命令作为输入 ls|grep myfilewho|awk print$1“t”$2df k|awk print$1|grep v“Filesystem”df k|awk print$1|grep v“Filesystem”|sed s/C:cygwin/gShell输入与输出ntee命令n将输出的副本送到标准输出,另一个副本拷贝到相应文件中ntee a files(-a:追加到文件中)nls l|tee ls.outnecho“some
14、thing”|tee/dev/consoleShell输入与输出n标准输入、输出和错误n标准输入:文件描述符0,默认键盘n标准输出:文件描述符1,默认屏幕n标准错误:文件描述符2,默认屏幕n输入输出的重定向Shell输入与输出command filenamecommand filenamecommand 1filename command 1filename command 2filename command 2filename command&filename=command filename 2&1(!=2&1 filename)n2&1 ni&jn&jn0 filename filena
15、menjfilename(见file1.sh)n&:文件描述符的复制,j复制到iShell输入与输出ncat myfile/dev/nullngrep“sky”absentfile 2grep.errncat existfile absentfile 1rec.out 2rec.errncleanup cleanup.out 2&1(将标准输出和标准错误重定向到文件中)文本过滤正则表达式n元字符:正则表达式中描述模式匹配操作的特殊字符n只匹配行首字符n$只匹配行尾字符n*任意多个字符n匹配其中单个或字符的范围n对特殊元字符进行转义n.单个字符文本过滤正则表达式npatternn匹配模式出现n次
16、npatternn,含义同上,但次数最少为nnpatternn,m含义同上,但出现次数在n与m之间n?模式出现0次或1次n*模式出现任意多次n+模式出现1次或更多次文本过滤正则表达式n.x.x.xndnsh$n.$n$n.n.2n*.pasnt.*.sh$nt*.sh$n0123456789n0-9na-zA-Z0-9-n0-9nabcn1n中都是单个字符匹配文本过滤正则表达式n重复表示符号前面的模式重复出现的次数n*、+、?n23*4n对于1548 Kerry 534 正则表达式1.*4 匹配整行,而不是154 文本过滤正则表达式n(a-z)(a-z)21:匹配anna,qwwq等nA2B:
17、匹配AABnA4,B:nA2,4B:n:匹配单词结束B:不在单词开始或结束文本过滤正则表达式n正则表达式的连接n正则表达式的“或”操作(|)n执行优先次序n重复*,+,?n连接n或:|n可用括号改变顺序文本过滤常用正则表达式nlnthengr(a|e)y n(To:|From:)(Seaman|Ramsay)n0-92-0-92-0-94na-za-z*n.0-90-9文本过滤grep命令ngrep option regexp filesngrep“hello”*ngrep c“hello”hello.sh(显示出现次数)ngrep l“hello”*(显示匹配文件名)ngrep n“hell
18、o”hello.sh(显示匹配的行及行号)ngrep v“hello”hello.sh(显示不匹配的行)ngrep i“hello”hello.sh(大小写不敏感)ngrep s“hello”hello.sh(屏蔽出错信息)文本过滤grep命令ngrep、正则表达式,与系统命令ngrep testngrep l2,testnls l|grep dnls l|grep d.x.x.xnps ax|grep“named”nps ax|grep“named”|grep v“grep”文本过滤egrep命令negrep:expression or extended grepn-f 选项使用文件作为匹配
19、参数ncat hello.parahelloworldnegrep f hello.para hello.sh文本过滤egrep命令nwho|egrep(user1|user2|user3)nwho|egrep v(user1|user2)negrep(yellow|red)flower(s)?*文本过滤awk命令nawk-F field-separator commands input-file(s)n在文本文件或字符串中按一定规则浏览和抽取信息n命令、程序、语言n用awk语言编写脚本nawk f awk-script-file input-file(s)文本过滤awk命令nawk BEGI
20、N BEGIN语句 处理数据 END 完成处理 filename文本过滤awk命令n例子:grade.txtM.Tansley 05/99 48311Green 8 40 44J.Lulu 06/99 48317green 9 24 26P.Bunny 02/99 48 Yellow 12 35 28J.Troll 07/99 4842 Brown-3 12 26 26L.Tansley 05/99 4712 Brown-2 12 30 28 文本过滤awk命令nawk print$0 grade.txtnawk print$1,$4 grade.txtnawk BEGIN print“Nam
21、en-”print$1 END print“end-of-report”grade.txt文本过滤awk命令nawk if($4/Brown/)print$0 grade.txtnawk$0/Brown/grade.txtnawk if($3/48/)print$0 grade.txtnawk$3=“48”print$0 grade.txtnawk$0!/Brown/grade.txtnawk if($6 0&$4/Brown/)print$0 grade.txtnecho pwd|awk F/print$NF文本过滤awk命令nawk name=$1;belts=$4;if(belts/Ye
22、llow/)print name“is belt”belts grade.txtnawk if($1=“M.Tansley”)$6=$6-1;print$1,$6,$7 grade.txtnawk if($1=“J.Troll”)($1=“J.L.Troll”);print$1 grade.txtnawk BEGINprint“NametDifference”if($6 out-file)sed用法nsed选项:n-n:不打印n-f:执行脚本n-h:帮助信息n-v:版本信息n-e:使用sed命令编辑nsed中定位文本n行号n正则表达式sed用法n例子文件:quote.txtnsed 2p qu
23、ote.txtnsed n 2p quote.txtnsed n 1,3p quote.txtnsed-n/e/p quote.txtn sed-n/The/p quote.txtn sed-n 4,/The/p quote.txtsed用法n sed-n/$/p quote.txtn sed-n 1,$p quote.txtnsed n/.*ing/p quote.txtnsed-e/music/=quote.txtnsed-n/music/=quote.txtnsed -n-e/music/=-e/music/p quote.txtsed用法n附加文本:aaddressatexttext.
24、textn插入文本 in修改文本行 c,可接受地址范围nsed-e/company/aThen suddenly it happend.It is really a disaster.quote.txtnsed脚本(见append.sed,insert.sed,update.sed,mix.sed)sed用法n删除文本sed 1d quote.txt sed 1,3d quote.txtsed$d quote.txtsed/Neave/d quote.txtsed用法n替换文本address,address s/pattern-to-find/replace-pattern/g,p,w,n s
25、ed s/night/NIGHT/quote.txtsed s/$/quote.txtsed-n s/$/p quote.txtsed s/The/Wow!/g quote.txtsed-n s/The/Wow!/gp quote.txt sed s/The/Wow!/gw sed.out quote.txtsed用法n sed-n s/nurse/Hello&/p quote.txtnsed 1,2 w file2 quote.txtnsed/Neave/w file3 quote.txtn读文本n sed/company/r sedex.txt quote.txtn sed/.a.*/q
26、quote.txtnsed-n 1,$l func.txtsed用法n常用例子:echo Mr Willis|sed s/Mr/&Bruce/gecho account.doc|sed s/./gecho accounts|sed s/$/.doc/gn x=Department+payrollBuilding G echo$x echo$x|sed s/+/of/g|sed s/Located at/gtr命令n用于字符转换或抽取控制字符necho“hellooo,World”|tr s“a-zA-Z”necho“hellooo world”|tr s“a-z”“A-Z”ntr s“015”
27、“n”input_filetr s“r”“n”input_filentr s“015032”“012*”/tmp/messagesrm/var/adm/messages mv/tmp/messages/var/adm/messages echo“finished cleanup”Shell脚本n#!/bin/shn#!/bin/bashn#!/usr/bin/perln#!/usr/bin/tcln#!/bin/sed fn#!/usr/awk-f 登录方式下的shell启动UNIX内核initgettylogin用户有效?/etc/inittab/etc/passwd终端Shell程序用户名
28、和口令命令是否bash的激活模式n交互式标准输入输出连到终端上nlogin:读初始化文件n非login:/.bashrcn受限:禁止一些操作(改变目录、修改$SHELL和$PATH变量、运行exec、运行包含/的命令,及使用重定向等)n非交互式用来运行shell脚本nif -n$BASH_ENV;then“BASH_ENV”;fibash的激活模式选项n-c stringn-in-r-restrictedn-loginn-posixn-noprofilen-norcn-rcfile filen-verbosen-helpn-version控制bash的行为nsetn可在命令行、初始化文件、脚本
29、中使用nset a(set allexport)nset+an.nshopt命令nshopt s cdable_varsnshopt u cdable_varsn二者都有很多可设置的选项,参看man bash初始化文件n/etc/profilen$HOME/.Bash_profile$HOME/.Bashrc$HOME/.Bash_login$HOME/.profilen设置文件创建的umask和$PATH$TERM、$MANPATH、$PS1、$PS2Shell环境变量n$PATH,$MANPATH,$LD_LIBRARY_PATH,$CD_PATHn$EDITOR,$VISIUALn$MA
30、IL,$MAILCHECKn$HISTSIZE,$HISTFILEn$TERM,$PAGERn.aliasn别名:交互式shell中缩短长命令的方法alias rm=“rm i”alias chomd=“chmod”unlias rmrm关于变量n内部变量nbuilt-in:(vs.shell command)n见internalvars.txtn例子(void.sh,seconds.sh,specialvar.sh)关于变量ndeclare变量的声明ndeclare-r var1 ndeclare-i number(见delcare.sh)ndeclare-a indices ndeclar
31、e-f functionsndeclare-x var3(见declare_x.sh)n对数字类型的操作:expr,let(见let.sh,expr.sh)ny=expr$y+1y=expr$y+1,let y=y+1let y=y+1,y=$($y+1)y=$($y+1)三者等价n$RANDOM:返回随机数n(.):进行数学运算(见arith.sh)数组n一维数组narea11=23narea13=37narea51=UFOs n或ndeclare a arean$area11n见(array.sh)Shell本地变量n在本次Shell生命期里使用的变量n变量的赋值,参见variable.s
32、hn清除变量:unsetn显示变量:setn测试变量necho“The sky is$COLOR:-grey today”necho$File:=mynecho$File:+another参数替换(parameter substitution)DEFAULT_FILENAME=generic.data filename=$1:-$DEFAULT_FILENAME#If not otherwise specified,the following command block operates#+on the file generic.data.#Commands follow.参数替换(param
33、eter substitution)n$parameter?err_msgn$parameter:?err_msgn(见(见checkvar.sh)参数替换(parameter substitution)n$var#Pattern,$var#Patternstrip_leading_zero()val=$1#0 return$val 见param_subst.sh关于变量stringnstring的长度n$#string nexpr length$string expr$string:.*n见stringlen.sh,stringmatch.sh,stringindex.sh,stringex
34、tract.sh,stringremoval.sh,stringreplace.shShell本地变量n变量的导出export:将变量导出到子进程n(见father.sh和child.sh)nlocal:局部变量参数位置变量n$pg findfilen#!/bin/bashn#findfilenfind/-name$1 printn$./findfile profile参数位置变量n$pg who_isn#!/bin/bashn#who_isngrep$1 passwd|awk F:print$4n$./who_is fangwn例子。$#,$*,$的例子(见allparams.sh)脚本参数
35、n$0.$9n$#,$*,$nshift命令ngetopts命令n见shift.sh,tr_case.sh,脚本参数ngetopts用法:n设定标准选项,在脚本或函数参数中查看所有以-开头的参数(即选项串)是否匹配标准选项。如果匹配,将匹配的选项赋给变量ngetopts 标准选项 变量n例如:getopts ahfvc VARn见backup.shshell数字常量n默认10进制n8进制:032n16进制:0 x32n2-64进制:base#number退出/返回状态n$?:返回上一条语句或脚本执行的状态n0:成功n1255:不成功nexit命令nexitnexit nnnShell编程n条件
36、测试n控制流结构(循环、分支等)nshell函数n调试脚本条件测试ntest或:测试命令执行状态、文件状态、比较表达式if cmp a b&/dev/null#Suppress output.then echo Files a and b are identical.“else echo Files a and b differ.fi 条件测试if grep-q Bash filethen echo File contains at least one occurrence of Bash.“fi$-w vartest.sh$test w vartest.sh条件测试n测试文件状态-d:目录-
37、s:文件非空-f:正规文件-w:可写-L:符号链接-u:文件有suid位-r:可读-x:可执行n例子 条件测试n比较表达式-eq=字符串:-ne!=-gt -n:非空串-lt -z:空串-le=条件测试n逻辑操作n-a,&n-o,|n!n例子gzip.sh控制流结构nif.then.else.fin见ifmkdir.shnif.then.elif.then.fin见ifelif.sh控制流结构ncase$variable in$condition1)command.;$condition2)command.;*)command.;esac n参见case.sh,case2.shcasepara
38、m.shcasevalid.sh控制流结构n循环(while,for,until loops)nfor循环for arg in listdo command(s).done(参见forlist.sh、forparams.sh、forcp.sh)控制流结构nfor循环for(expr1;expr2;expr3)docommand(s).donen见for_c.sh控制流结构nwhile循环nwhile conditiondo command.done n参见while1.sh、whileread.sh等控制流结构nuntil循环循环nuntil condition-is-truedo comma
39、nd.done n见until.sh控制流结构n循环控制:break,continuenbreak:推出循环或case语句(break-levels.sh)ncontinue:跳过本次循环步shell函数nfunction function_name command.return(exit_status)n nfunction_name()command.参见functionfile.sh,functions.sh与direc_check.shn在命令行执行函数,顺序先于同名命令shell函数nlocal variablesn生命期只在block或function中n见local.sh子she
40、llnshell脚本subshelln(command1;command2;command3;.)作为子shell运行nexternal command vs.builtinnbuiltin:help nhelp echonhelp getopts创建屏幕输出和输入n创建屏幕输出n控制光标出现与否、光标位置、颜色控制n需要在echo语句中使用控制字符(color.sh);或者:n专门的tput命令(sh)n创建屏幕输入n验证输入数据的有效性。Shell工具n创建日志文件或临时文件n检测信号neval创建日志或临时文件n创建日志文件n根据日志文件创建的日期和时间识别日志文件ndate命令(log
41、.sh)date-date 2 days ago date-date 3 months 1 day date-date 25 Dec+%j date+%B%d date-d 1-may+%B%-d创建日志或临时文件n创建唯一的临时文件n利用$,n当前进程的进程号,作为临时文件扩展名信号n系统向脚本或命令发出的消息,告知某些时间的发生n常用信号1SIGHUP挂起或父进程被杀死2SIGINT键盘中断ctrl+c3SIGQUIT从键盘退出9SIGKILL无条件终止11SIGSEGV内存段冲突15SIGTERM软件终止(kill中默认信号)信号ntrap“name”signalsnname:处理捕捉到
42、的信号的专门函数nsignal(s):逮捕捉的信号ntrap“”2 3ntrap“command”2 3ntrap 2 3trap 2 3见trap.shevaln对参数进行两次扫描和替换.nmyfile=“cat ctrlchar1.txt”echo$myfilenmyfile=“cat ctrlchar1.txt”eval echo$myfilenmyfile=“cat ctrlchar1.txt”eval$myfileevaln对最后一个参数的表示neval echo$#ncat dataPCpentiumIVMONITORsvgaNETWORKyesn希望echo$PC,得到pentiumIV(见eval.sh)习题:n写一段脚本,将自己的内容反向输出到标准输出。n提示:逐行将脚本读入,反向显示DOS文件向LINUX下文件的转换wc l(统计文件的行数)n两个文件A,B,求A-BBash帮助nman bash130 结束语结束语