Linux与Shell编程周靖山zhoujingshan@chinanetcenter.comLinux与Shell编程1.Shell命令Shell常用命令介绍正则表达式管道2.Shell编程Shell脚本流控制Shell函数Shell脚本例子编程风格和规范Shell命令Shell常用命令(一)输入输出echo,read,printftee,cat,head,tailShell常用命令(二)字符串处理grep,awk,sed,trsort,uniqcut,paste,join,splitShell常用命令(三)文件操作find,xargschmod,chown,chgrpShell常用命令(四)数学函数exprbcShell常用命令(五)系统相关pwd,date,sleephistory,mancron,at,nohup正则表达式与grepgrep的全称GloballysearchfortheRegularExpressionandPrintoutthelinegrep对文本文件进行模式查找。如果找到匹配模式,grep打印包含模式的所有行.grep支持基本正则表达式,也支持其扩展集grep扩展grepegrep:支持扩展的正则表达式快速grepfgrep:查找字符串而不是模式mangrep:…Egrepisthesameasgrep-E.Fgrepisthesameasgrep-F.…grep元字符^行的开始例:^a$行的结束例:end$,^$grep元字符.一个任意字符例:a.a*匹配零个或多个先前字符例:a*,.*grep元字符[]匹配指定范围内的字符例:[Aa],[0-9],[a-zA-Z][^]匹配不在指定范围内的字符例:[^0-9]grep元字符x\{m\}字符x重复m次x\{m,\}字符x重复至少m次x\{m,n\}字符x重复至少m次,至多n次例:0592[0-9]\{7\}grep元字符\,\单词的开始和结束\w字母和数字,[0-9a-zA-Z]\W非字母和数字,[^0-9a-zA-Z]grep元字符\(\)分组符号,标记匹配字符在egrep中love(able|rs)匹配多次\(\[a-zA-Z]*\\).*\\1\grep特殊字符查询特殊字符,前面要加\特殊字符:.'*[]^|\+?egrep(grep的扩展集)+匹配一个或多个先前字符?匹配0个或多个先前字符a|b|c匹配a或b或c()同grep的\(\){}同grep的\{\}正则表达式举例(查询ip地址)grep'[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'正则表达式举例(查询ip地址)grep-E'^([0-9]|([1-9][0-9]{1})|(1[0-9]{2})|(2(([0-4][0-9])|5[0-5])))\.([0-9]|([1-9][0-9]{1})|(1[0-9]{2})|(2(([0-4][0-9])|5[0-5])))\.([0-9]|([1-9][0-9]{1})|(1[0-9]{2})|(2(([0-4][0-9])|5[0-5])))\.([0-9]|([1-9][0-9]{1})|(1[0-9]{2})|(2(([0-4][0-9])|5[0-5])))$'正则表达式举例(查询ip地址)([0-9]|([1-9][0-9]{1})|(1[0-9]{2})|(2(([0-4][0-9])|5[0-5])))[0-9]0-9[1-9][0-9]{1}10-991[0-9]{2}100-1992(([0-4][0-9])|5[0-5])200-255文件名置换Shell提供了一套完整的字符串模式匹配规则,或者称之为元字符,这样你就可以按照所要求的模式来匹配文件。文件名置换*匹配文件名中的任何字符串,包括空字符串。?匹配文件名中的任何单个字符。[]匹配[]中所包含的任何字符。[!]匹配[]中非感叹号!之后的字符。文件名置换例ls[Mm]akefileShell处理文件名[root@redhattest]#ls.abcd[root@redhattest]#ls*则shell调用ls的参数为lsabcd结果输出abcd文件列表太长文件名置换由shell处理置换后生成文件列表可能太长(shell命令支持的参数个数有限制)文件列表太长[root@redhattest]#lsdir/*-bash:/bin/ls:Argumentlisttoolong[root@jyredhattest]#lsdir00001008611081…文件列表太长[root@jyredhattest]#rmdir/*-bash:/bin/rm:Argumentlisttoolong[root@jyredhattest]#lsdir|xargsrmShell和引号为什么要使用引号?脚本中执行行操作时,shell将对脚本设置予以解释。要采取一种方法防止shell这样做,即使用引用号,包括各式引用或使用反斜线。Shell和引号例:#echo1*21test.sh2#echoa$bcac#printf%sIamastringIamastringShell和引号双引号:除$、倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作为普通字符对待单引号:由单引号括起来的字符都作为普通字符出现Shell和引号倒引号:倒引号括起来的字符串被shell解释为命令行,在执行时,Shell会先执行该命令行,并以它的标准输出结果取代整个倒引号部分反斜线:如果下一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。Shell引用与grep特殊字符引用:在参数传递给程序(如grep等)之前,shell的处理。grep特殊字符:传给grep程序之后,grep对字符的解释。Shell引用与grep特殊字符要搜索的文件内容a'a'a\'a\'\a\Shell引用与grep特殊字符搜索\”a\”grep”\\\\\”a\\\\\””grep”\\\\\\\”a\\\\\\\””grep„\\”a\\”„grep„\\\”a\\\”„grep–F”\\\”a\\\””grep–F„\”a\”‟Shell引用与grep特殊字符搜索\‟a\‟grep“\\\‟a\\\‟”grep“\\\\‟a\\\\‟”(grep‟\\‟\‟a\\\\\‟)grep–F“\\‟a\\‟”标准输入、输出和错误当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。缺省是:键盘,屏幕,屏幕标准输入、输出和错误在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件重定向。文件重定向commandfilename把标准输出重定向到一个新文件中commandfilename把标准输出重定向到一个文件中(追加)command1fielname把标准输出重定向到一个文件中commandfilename2&1把标准输出和标准错误一起重定向到一个文件中command2filename把标准错误重定向到一个文件中文件重定向command2filename把标准输出重定向到一个文件中(追加)commandfilename2&1把标准输出和标准错误一起重定向到一个文件中(追加)commandfilenamefilename2把command命令以filename文件作为标准输入,以filename2文件作为标准输出文件重定向commandfilename把command命令以filename文件作为标准输入commanddelimiter把从标准输入中读入,直至遇到delimiter分界符command&m把文件描述符m作为标准输入command&m把标准输出重定向到文件描述符m中command&-把关闭标准输入文件重定向文件/dev/null例:命令/dev/null命令/dev/null2&1管道管道:把一个命令的输出传递给另一个命令作为输入。命令1|命令2|命令3管道管道可以把几个命令组合起来,完成复杂的功能。Shell脚本Shell脚本的优势使用功能强大的系统命令简单Shell脚本的缺点效率低不适合复杂的项目---“HelloShell!”---#!/bin/sh#thisismyfirstshellscriptechoHelloShell!exit0---“HelloShell!”---起始行解释器文件/bin/sh注释Shell命令用exit退出(通过$?检查退出状态,8位的无符号数)运行shell脚本#chmod755hello.sh#./hello.shHelloShell!#echo$?0Shell变量shell变量赋值(如果取值包含空格,要用引号括起来):variable-name=valueShell变量使用变量时,在变量前加$可以用花括号将之括起来,可以防止shell误解变量值:(${x}y)echo$variable-name或echo${variable-name}Shell脚本的变量shell变量没有类型shell变量使用前不需要声明x=1y=2echo$x$yexpr$x$y+$yShell变量将变量并排可以使变量结合在一起${var1}${var2}设置只读变量readonlyvariable-namereadonly之后无法被修改,也无法删除Shell变量Shell变量区分大小写字母本地变量:在用户现在的shell生命期的脚本中使用。Shell变量使用unset命令清除变量unsetvariable-name使用set命令显示所有本地定义的shell变量(包括环境变量)Shell变量特殊用法Variable-name=value设置实际值到variable-namevariable-name:=value如果未设置variable-name,设置其值variable-name:-value同上,但是取值并不设置到variable-name,可以被替换Shell变量举例#x=1#unsety#echo${x:-2}1#echo${y:-2}2#echo$x1#echo$y#x=1#unsety#echo${x:=2}1#echo${y:=2}2#echo$x1#echo$y2环境变量Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。环境变量export导出环境变量x=1exportx用unset清除环境变量unsetx用env显示所有环境变量环境变量举例#envPATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/binHOME=/rootCVSROOT=:pserver:zjs@192.168.21.45:/home/cvs环境变量#x=GLOBAL#exportx#./1.shGLOBALLOCAL#echo$xGLOBAL#!/bin/shecho$xx=LOCALecho$x环境变量Shellx=GLOBAL1.sh(Shell的子进程)x=LOCALShe