资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Shell,编程简介(,ksh),Shell,简介,Shell,程序中的变量和运算符,Shell,程序中的流程控制语句,Shell,程序中的输入输出,Shell,程序中的过程,Shell,程序的调试,其他,Shell,编程工具,Shell,简介,Shell,是命令语言解释器:,UNIX,核心与用户间的桥梁,命令语言解释执行的环境:别名,alias、,全局变量,alias ll=ls l,LDRSHOME=/scompt/qq,export LDRSHOME,命令语言脚本的解释器,Shell,命令语言的几个重要特征,用简单的小工具组成功能强大的工具,进程的执行和终止,元字符和模式匹配,管道和重定向,元字符和模式匹配,命令的执行:&()|,文件名扩展:*?-,转义和续行字符:,三种引号:“,变量:$,$,PWD,$PWD,注释:#,模式匹配:.*-$,扩展:|()+?,重定向:&,命令组合,命令组合,其中的命令用 分隔,a&b,仅当,a,执行成功时执行,b,,用于检查初始条件,如:,test e init.dat&cat init.dat,a|b,仅当,a,执行失败时执行,b,,用于错误处理,如:,test e init.dat|echo“no initial file found”,a,;b,顺序执行,a,和,b,命令组合用()括起时在,子,Shell,中执行,用 括起时在当前,Shell,中运行,举例:,parentDir=(cd.;pwd),三种引号:“,引号:要求,Shell,对引号内的内容作特殊处理。,单引号,保持字符串的原样,不进行任何替换,ls*.cpp,echo$PWD=$PWD,三种引号:“,双引号“,使,Shell,只解释$和,即替换变量和转义。,line=“This is a single line.”,print“$line”,echo“This is a double quoted line.”,“”,使,Shell,不解释*,?元字符,三种引号:“,倒引号 (键盘左上角),命令替换:将 内的内容当成命令行上的命令输入执行,以命令执行结果作为字符串的内容,,Shell,对命令行输入的解释均适用。,cmd=“pwd”,echo$cmd,ksh,中命令替换的另一种方式:$(命令),cmd=“pwd”,echo$($cmd),注意()在命令组合中的用法,转义和续行字符,Shell,对命令行中 的解释:,在命令行中间:去掉其后任意字符的特殊含义,echo$PWD,在命令行末尾:续行,Shell,对引号内 的解释:,其后跟$“时去掉这些字符的特殊含义,对其他 不做解释:,ls“n”,其它程序对 的解释,在,Shell,解释之后再一次解释,通常是赋予其后的字符以特殊含义,比较:,echo ls,echo“”ls“”,echo“FirstnSecond”ls“n”,模式匹配,正则,表达式,.匹配任意单个字符,*表示重复零次或多次,表示一组字符,用 表示连续的一组字符,表示行的开始,在 中时表示“非”,$表示行的结尾,转义,重定向,输入重定向,command,inputfile,从文件,inputfile,中,读入,command,outputfile,将命令的输出写入到,output_file,中,command,outputfile,将,命令的输出加在,outputfile,的末尾,command m,outputfile,将送往文件描述字,m,的输出写入文件,outputfile,command m,outputfile,将送往文件描述字,m,的输出加在文件,outputfile,的末尾,command m,&,n,将送往文件描述字,m,的输出合并到送往文件描述字,n,的,输出中,,m,的默认值为 1,,UNIX,保留 0,1,2 为标准输入,标准输出和错误输出,用户可以使用 39。,重,定向,举例,,,将错误输出重定向到文件中:,cat test.dat,set o noclobber,echo“something”2error.dat test.dat,Shell,程序中的注释,标准,Shell,的注释:#,指定脚本解释器:,#!/,usr/bin/perl,open(TP,“foo.dat);,my top=;,close(TP);,Shell,程序中的变量和运算符,运算符,同,C,语言,变量不需定义,变量的命名同,C,语言,变量的赋值,变量名,=,值,ksh,中等号前后不能有空格(区分,命令,参数,的形式),可以在一行中给多个变量赋值,用空格隔开,变量的删除,unset,变量名,Shell,程序中的变量和运算符,变量的作用范围:,子,Shell,的概念和,export,.,命令,每一个脚本都在自己的子,Shell,中运行,export,命令影响子,Shell,的环境,.,命令影响父,Shell,的环境,Shell,的标准变量,位置变量和,shift,命令:脚本用于得到输入参数的方法,用$1,$2,$3,$9,$10,表示各个参数,,shift,命令用于遍历参数表,$0 表示脚本的名字,不受,shift,命令影响,举例,显示多个文件的内容,脚本,catfiles,的内容:,while -r“$1”,do,cat“$1”,shift,done,运行:,catfiles foo.txt bar.txt,Shell,的标准变量,Shell,使用的标准变量:,EDITOR,HOME,PATH,PS1,PS2,SHELL,举例,改变提示符:,PS1=$PWD,$,注意要使用单引号,Shell,的标准变量,由,Shell,修改的标准变量:,ERRNO,PWD,PPID,进程变量:$?(最后执行的命令的返回值)$,(,Shell,本身的进程号)$-(,Shell,启动时的参数表)$!(最后在后台执行的进程号),其他:$#(参数的个数),$_(最后命令的最后一个参数),Shell,程序中的流程控制语句,if,case,for,while,until,select,与,C,语言相似,有一些差异,exit,break,continue,Shell,程序中的流程控制语句,举例:,if,语句的几种格式,if,test-conds,if test,test-conds,;then,thencommands.,commands.,elif,test-conds,else,commands.,commands.,else,fi,commands.,fi,Shell,程序中的流程控制语句,举例,,case,语句,case value in,pattern1),commands,pattern2),commands,patternn),commands,esac,Shell,程序中的流程控制语句,举例,,select,语句,#!/,bin/ksh,select file in/scompt/qq/*QUIT,do,if -f$file ;then,file$file,elif -d$file ;then,ls-l$file,else,break,fi,done,Shell,程序中的流程控制语句,举例,,for,循环,for,letter,in,a b c d,do,commands,done,in,可以省略,默认为遍历位置变量,Shell,程序中的流程控制语句,条件判断语句$,foo=y,相当于,test$foo=y,,注意 后,前必须有空格,且等号前后必须有空格,test,的常见使用情况:,$,foo eq 0,整数比较,$,foo=y,字符串比较,test-d/scompt/qq,是否是目录,test f/scompt/qq/foo.cpp,是否是文件,test e/scompt/qq/foo.cpp,文件是否存在,test r/scompt/qq/foo.cpp,文件是否可读,Shell,程序中的输入输出,echo,print,read,read,变量名,read,变量名,?,提示,举例:,read yourname?”Please input your name:”,重定向,流程控制语句的重定向,while true,do,.,done temp.txt,Anything you want to input in the temp.txt,Ctrl-D,temp=temp.txt,trap rm f$temp;exit 1 2 15,Ctrl-C,ksh,中的一些有用特征,命令行编辑,按一次,Esc,使用,vi,中的编辑命令,命令补全,按两次,Esc,命令的重用,如:,r make,,在命令历史中查找最近的以,make,开头的命令并执行,用,alias,可以看到,r,是,Shell,内部命令,fc e,的别名,Shell,程序的调试,1、两种方法:,sh nvx foo.sh,或,set-nvx,在程序中加入语句,set nvx,2、,说明:,-,v,输出读入的语句,-,x,输出替换后实际执行的语句,前加+表示,-,n,不真正执行语句,3、其他调试技巧:,用,echo,调试简单而危险的语句(,rm,mv),Shell,程序的例子,#!/,usr/bin/sh,#(#)$Revision:72.2$,#calendar.sh-calendar command,uses/usr/lbin/calprog,PATH=/usr/bin,#,临时文件,_1=/,tmp/$.1,_2=/tmp/$.2,#,信号处理,EXIT,SIGHUP,SIGINT,SIGPIPE,SIGTERM,trap“rm-f$_1$_2;trap 0;exit”0 1 2 13 15,case$#in,0)if -f calendar;then,/usr/lbin/calprog$_1,LANG=egrep-f$_1 calendar,else,echo$0:pwd/calendar not found&2,fi;,Shell,程序的例子,*),pwget|sed s/(:*):.*:(.*):*$/_dir=2 _user=1/|,#,查找用户和目录,第一和倒数第二个字段,while read _token;do,eval$_token#evaluates“_dir=/scompt/qq _user=qq”,赋值,if -s$_dir/calendar;then,/usr/lbin/calprog$_dir/calendar$_1,LANG=egrep-f$_1$_dir/calendar$_2 2/dev/null,if -s$_2;then,mail$_user$_2,fi,rm-f$_2,fi,done;,esac,rm-f$_1,exit 0,其他,Shell,编程工具,两种真正的程序设计语言:,Perl,建立在,C,Shell,编程,,awk,和,sed,基础上的脚本语言,Tcl/Tk,另一种使用广泛的脚本语言,易于扩展,
展开阅读全文