1、请您按击鼠标,编辑标题文的格式。,请您按击鼠标,编辑大纲正文格式。,第二个大纲级,第三个大纲级,第四个大纲级,第五个大纲级,第六个大纲级,第七个大纲级,第八个大纲级,第九个大纲级,Lesson09Shell脚本,复习,配置文件与source命令,特殊符号:?*;&|,重定向,管道:cut sort wc uniq tee tr grep,内容提要,正则表达式,Shell Scripts,正则表达式,正则表达式,.,代表一个任意字符,一定要有一个字符存在,?,匹配0次或者1次,也可以用于表示单一字符,*,匹配任意次,也可以用于表示任意字符,list,列表中的字符,range,列表中范围内的字符,
2、范围用“-”分隔,正则表达式,正则表达式,list,不属于list的元素,与 list 相反,range,不属于range的元素,与 range相反,n,与前一个相同条件连续匹配n个,n,m,与前一个相同条件连续匹配n到m个,正则表达式,正则表达式实验,假设有如下文本,文件名称为t:,hi,i am eric,my phone is 023-68587573,mobile phone is 13667620661,at changsha,i will use 0731-6858670,my id is 22334455667,my email is eric-hxy,may be u can
3、also use ERIC-HXY163.COM,call me please,bye,正则表达式,问题:,如何查找文本中的移动电话?,grep-e 130-99,如何查找文本中的固定电话号码?,grep-e 00-92,3-0-97,8,Shell Scripts,什么是Shell Scripts?,一系列连续命令,如何执行?,使文件具备执行属性,然后执行,使用sh命令,如sh a,Shell Scripts,建立第一个脚本:,vi test01,输入 echo hello scripts world,保存退出,增加可执行权限:chmod a+x test01,执行./test01,去掉可执
4、行权限:chmod a-x test01,执行./test01,执行 sh test01,Shell Scripts,默认变量类型是字符串,其他变量声明用d:,语法:,declare-afir 变量名称=初始值,含义:-a定义数组,-f定义函数,-i定义整数,-r定义只读变量,Shell Scripts,变量声明举例:,a1=10,b1=20,c1=$a1*$b1,echo$c1,declare-i a2=10,declare-i b2=20,declare-i c2=$a2*$b2,echo$c2,实验,Shell Scripts,变量声明注意事项:,变量赋值等号两边不能有空格,如果变量值包
5、含空格,最好使用引号。如果没有引号,那么该值中的第二个单词会当作命令执行。例如:,aa=b pwd,aa=b pwdd,echo命令打印变量时,最好用引号括起,否则echo将解析其中的特殊符号,列出当前目录下面的文件名称,例如:,aa=*,echo$aa,如果“$variable”表示一个命令,则会自动执行它,例如:,aa=pwd;$aa,Shell Scripts,set命令的其他用法:,set 参数列表,效果:依次把各位置参数设置为参数列表中的值,从$1开始,举例:,set date,echo$1,$2,$3,注意:如果参数列表中第一个可能以-开头,则应该使用,set 参数列表,,,例如:
6、set-a-b-c,set-a-b-c,echo$,Shell Scripts,shell算术运算(1/2):,可以使用 shell 结构来执行简单的整数运算。只需将特定的算术表达式用$(和)括起,bash 就可以计算表达式,举例:,echo$(100/3),myvar=56,echo$($myvar+12),echo$($myvar-$myvar),myvar=$($myvar+1),echo$myvar,Shell Scripts,shell算术运算(2/2):,也可以使用“expr 表达式”来计算表达式的值。可以使用的运算符包括=$a,echo expr$a=$a,Shell Scri
7、pts,跟用户交互read:,echo input u name:,read name,echo u name is$name,参数的读取:,$0代表命令或者脚本名称,$1代表第一个参数,一直到9,实验,Shell Scripts,shift命令,作用:将参数左移,语法:shift N,含义:将命令行参数左移N个位置,默认为1,举例:,echo$0$1$2,shift,echo$0$1$2,shift 2,echo$0$1$2,Shell Scripts,常用的逻辑判断:,-f 检测文件是否存在,-d 检测目录是否存在,-e 检测对象是否存在,对象可以是任何东西,-r 文件是否具备可读属性,-
8、w 是否可写,-x 是否可执行,-s 文件是否非空,-u 文件是否具备SUID,-g 文件是否具备SGID,-k 文件是否具备sticky bit属性,&逻辑与,|逻辑或,Shell Scripts,常用的整数运算符:,-eq 等于,-ne 不等于,-lt 小于,-gt 大于,-le 小于或等于,-ge 大于或等于,Shell Scripts,常用的字符串运算符:,str 若str为非空字符串则为真,str1=str2 若str1与str2相同则为真,str1!=str2 若str1与str2不相同则为真,str1str2 若str1比str2排序较大则为真,-z str 若str长度为0则为
9、真,-n str 若str长度大于0则为真,Shell Scripts,字符串与数字比较的区别:,myvar=1,if$myvar-eq 01;then=相等否?,echo myvar is number 1,fi,if$myvar=01;then=相等否?,echo myvar is char 01,fi,Shell Scripts,字符串比较经典问题(引号重要性):,var1=who am i,var2=who,if$var2=who;then,echo oho,fi,if$var1=who am i;then,echo yeah,fi,应用字符串变量时最好把双引号加上,Shell Scr
10、ipts,条件判断:,最简单的条件判断,if condition;then,action,fi,注意:,在中,只能有一个判断式,在与之间,可以使用&或|组合,Shell Scripts,条件判断:,复杂的if语句:,if condition;then,action,elif condition2;then,action2,elif condition3;then,else,actionx,fi,Shell Scripts,问题1:,如果用户输入Y或者y就打印hello,否则打印bye,这个脚本该如何写?,echo press any key to continue,read key,if$ke
11、y=y|$key=Y;then,echo hello,else,echo bye,fi,Shell Scripts,问题2:,根据用户输入进行判断,如果是目录,则列出目录下文件的数量,否则列出文件的大小和inode,if test-f$1,then,filename=$1,set ls-il$filename,echo file$filename inode=$1 and size=$6,fi,if -d$1;then,count=ls$1|wc-w,echo directory$1 have$count files,exit 0,fi,Shell Scripts,条件判断:,分支判断:,ca
12、se 字符串 in,串1),动作1,;,串2),动作2,;,*),动作3,esac,Shell Scripts,问题:,根据用户输入字符串的长度判断,如果长度为3,就在其前面加入00,如果为4,则加入0,其他情况则加入haha_,打印最后结果,该如何写?,echo input a string:,read str,count=echo$str|wc-m,case$count in,4),str=00$str,;,5),str=0$str,;,*),str=haha_$str,esac,echo now str is:$str,Shell Scripts,循环:,for语句:,for(条件1;条
13、件2;条件3),do,action,done,for 变量 in 变量1 变量2.,do,action,done,注意:不带in部分时参数有命令行提供,Shell Scripts,简单for实例:,for i in eric carol hexy,do,echo hello$i,done,for a in./*,do,if -f$a;then,echo$a,fi,done,Shell Scripts,问题:如何读取所有命令行参数进行显示?,declare-i i,for a,do,i=i+1,echo$i parameter is$a,done,Shell Scripts,循环:,while语
14、句:只要条件满足就一直执行,while 条件,do,action,done,Shell Scripts,循环:,until语句:直到满足条件才退出,until 条件,do,动作,done,Shell Scripts,问题1:分别用while和until来实现打印1到10数字,declare-i i=1,while$i-le 10,do,echo$i,i=i+1,done,until$i-gt 10,do,echo$i,i=i+1,done,Shell Scripts,问题2:写一个脚本,把所有参数计算所有参数之和,count=0,while$#!=0,do,count=$($count+$1)
15、count=expr$count+$1,shift,done,echo count is$count,Shell Scripts,函数定义,语法:,函数名称(),函数体,函数调用方法:,函数名称,Shell Scripts,函数举例:,myvar=hello,myfunc(),myvar=one two three,for x in$myvar,do,echo$x,done,#invoke function,myfunc,echo$myvar$x,Shell Scripts,解决函数中的名字空间问题,使用local:,myvar=hello,myfunc(),local myvar=one two three,for x in$myvar,do,echo$x,done,#invoke function,myfunc,echo$myvar$x,Shell Scripts,脚本调试:,sh-nv scripts,-n 不执行脚本,查询脚本语法,有错误就列出,-v 执行脚本之前,先将脚本内容提示在屏幕上,查看脚本实例(创建学生帐号),小结,正则表达式,set,$(.),read,逻辑判断,if,for,while,until,函数,






