linux-shell

上传人:biao****biao 文档编号:243149460 上传时间:2024-09-16 格式:PPT 页数:62 大小:167KB
返回 下载 相关 举报
linux-shell_第1页
第1页 / 共62页
linux-shell_第2页
第2页 / 共62页
linux-shell_第3页
第3页 / 共62页
点击查看更多>>
资源描述
单击以编辑母版标题样式,单击以编辑母版文本样式,第二级,第三级,第四级,第,6,章 第,*,页,B-Shell,及编程,第,6,章 第,2,页,主要内容,主要目的,编写,shell,脚本,程序,交互方式下,使用,shell,的流程,控制,编写复合命令,主要内容,元字符,如:引号,shell,的变量,替换,命令替换,文件名生成,shell,变量,流程控制,子程序,第,6,章 第,3,页,常见的,shell,sh,: Bourne Shell,是,AT&T Bell,实验室的,Steven Bourne,为,AT&T,的,Unix,开发的,它是,Unix,的默认。,csh,:C Shell,是加州伯克利大学的,Bill Joy,为,BSD Unix,开发的,它的语法与,C,语言很相似。,ksh,:Korn Shell,是,AT&T Bell,实验室的,David Korn,开发的,与,Bourne Shell,向下完全兼容。,Bash:,Bourne Again Shell (,即,bash),是自由软件基金会,(GNU),开发的一个,Shell,,它是,Linux,系统中一个默认的,Shell,。,命令记忆、命令与文件补全、命令别名设置、通配符和强大的脚本,1,启动,B-shell,第,6,章 第,5,页,启动交互式,B-shell,启动方法,注册,shell,键入,sh,命令进入了,B-shell,自动执行的批处理文件,当,sh,作为注册,shell,被启动时,自动执行用户主目录下的,.profile,文件中命令,记作,$HOME/.profile,类似,umask,之类的命令,应当写在,.profile,文件中,第,6,章 第,6,页,sh,脚本的执行,编辑文件,lsdir(,格式为文本文件,),#,!,/bin/sh,if $# = 0 ,then,dir=.,else,dir=$1,fi,find $dir -type d print,执行这一脚本,(script),文件的方法,:,shlsdir,sh lsdir,chmod u+x lsdir; ./lsdir /bin,三种方法均启动程序,/bin/sh,,生成新进程,2,重定向与管道,第,6,章 第,8,页,输入重定向,filename,从文件,filename,中获取,stdin,例如,: sort telno.txt,word,从,shell,获取数据直到再次遇到定界符,word,cat ,filename,将,stdout,重,定向到文件,filename,2,filename,将文件句柄,2,重定向到文件,filename,2&1,将文件句柄,2,重定向到文件句柄,1,指向的文件,sh,允许对除,0,,,1,,,2,外其它文件句柄重定向,第,6,章 第,10,页,输出重定向,(,例,1),ls -l file.list,将命令,ls,标准输出,stdout,定向到文件,file.list,中,try try.out 2try.err,try 1 try.out 2try.err,将,try,程序,执行后的,stdout,和,stderr,分别,重定向到不同的文件,try rpt 2&1,stdout,和,stderr,均,存入文件,rpt,try 2&1 rpt,stderr定向到终端,,,stdout重定向到文件,第,6,章 第,11,页,管道,管道将左侧命令的输出发送到右侧命令的输出。一条管道线,(pipeline),可能不止一个管道,ls -l | grep d,前一命令的,stdout,作后一命令的,stdin,cc try.c -o try 2&1 | more,前一命令的,stdout+stderr,作为下一命令的,stdin,3,变量,第,6,章 第,13,页,sh,变量,存储的内容,字符串,(,对于数字串来说,不是二进制形式,),在执行过程中其内容可以被修改,变量名,第一个字符必须为字母,其余字符可以是字母,数字,下划线,第,6,章 第,14,页,变量的赋值和引用,简单赋值与引用,addr=20.1.1.254,echo $addr,注意:赋值作为单独一条命令,等号两侧,不许多余空格,引用,addr,变量,$addr,,,echo,执行前,,sh,完成变量替换,赋值时,等号右侧字符串中含有特殊字符,,unit=”Beiyou University”,echo $unit,引用未定义变量,变量值为空字符串,echo Connect to $proto Network,proto=TCP/IP,echo Connect to $proto Network,第,6,章 第,15,页,命令,echo,语法与功能,echo arg1 arg2 arg3 .,打印各命令行参数,每两个间用一空格分开,最后打印换行符,不可打印字符,(,转义,),:,Linux,需加选项,-e,echo,支持,C,语言字符串常数描述格式的转义和,c,c,打印完毕,不换行,b,退格,n,换行,r,回车,t,水平制表,反斜线,nnn,八进制描述的,字符,ASCII,码,举例,echo Beijing China,echo Beijing China,echo 065,打印,5,echo 101,打印,A,echo r$cnt c,第,6,章 第,16,页,read:,读用户的输入,内部命令,read,:变量取值的另外一种方法,从标准输入读入一行内容赋值给变量,例:读取用户的输入,并使用输入的信息。,$,read name,ccp.c,$,echo $name,ccp.c,$,ls -l $name,-rw-r-r- 1 jiang usr 32394 May 27 10:10 ccp.c,$,第,6,章 第,17,页,环境变量和局部变量,默认类型,所创建,的,shell,变量,默认为局部变量,内部命令,export,局部变量转换为环境变量,例如:,export proto,局部变量和环境变量,shell,启动,的子进程继承环境变量,不继承局部变量,子进程对环境变量的修改,不影响父进程中同名变量,相关命令,set/env,内部命令,set,列出当前所有变量及其值,包括环境变量和局部变量,外部命令,/bin/env,列出环境变量及其值,第,6,章 第,18,页,系统的环境变量,创建,登录后系统自动创建一些环境变量影响应用程序运行,HOME,:用户主目录的路径名,PATH,:命令查找路径,与,DOS,不同的是,它不首先搜索当前目录,PATH=/bin:/usr/bin:/etc,PATH=./:/bin:/usr/bin:/etc,先搜索当前目录,PATH=/:bin/usr/bin:/etc:./,后搜索当前目录,PS1,和,PS2,:主提示符和副提示符,sh,副提示符:当一个命令在一行内输不完需几行输入一个命令时,第,2,行及其它行用副提示符,TERM,:终端类型,全屏幕操作的软件,(,如,vi),,使用它搜索终端库,4,替换,第,6,章 第,20,页,shell,替换,Shell,的替换工作,:,先替换命令行再执行命令,文件名生成,变量替换,命令替换,文件名生成,遵循文件通配符规则,按照字典序排列,如,: ls *.c,文件名替换后实际执行,ls a.c x.c,变量替换,ls $HOME,echo ”My home is $HOME, Terminal is $TERM”,文件名置换,* 匹配文件名中的任何字符串,包括空字符串,? 匹配文件名中的任何单个字符,.,匹配, ,中所包含的任何字符,!.,匹配, ,中非感叹号!之后的字符,ls .*ls frozena-zz-a.txt,第,6,章 第,21,页,第,6,章 第,22,页,shell,替换,:,命令替换,用反撇号,now=date,以命令,date,的,stdout,替换,date,./arg date,实际执行,./arg Sun Dec 4 14:54:38 Beijing 2006,frames=expr 5 + 13,echo $frames,18,count=10,count=expr $Count + 1,echo $count,11,第,6,章 第,23,页,shell,内部变量:位置参数,$0 $1 $2 .,0,脚本文件本身的名字,后边为参数,$,?,程序返回值,$#,命令行参数的个数,$*,”$1 $2 $3 $4 .”,$,”$1” ”$2” ”$3” ,第,6,章 第,24,页,位置参数使用举例,$,cat param,echo $#,echo Usage: $0 arg1 arg2 .,./arg $,./arg $*,$,./param Copy Files to $HOME,4,Usage: ./param arg1 arg2 .,0:./arg,1:Copy,2:Files,3:to,4:/usr/jiang,0:./arg,1:Copy Files to /usr/jiang,5,元字符,第,6,章 第,26,页,shell,元字符,(1),空格,制表符,命令行参数的分隔符,回车,执行键入的命令, file list,vi 2&1,echo Unix System V,与,echo Unix System V,echo *,与,echo *,echo $HOME,与,echo $HOME,echo A,与,echo A,echo Windows Directory is C:WindowsWORK.DIR,echo Windows Directory is C:WindowsWORK.DIR,第,6,章 第,29,页,元字符:引号,双引号,除,$,和,外特殊字符的特殊含义被取消,需要的转义,“ $ ,echo *,与,echo *“,单引号,对所括起的任何字符,不作特殊解释,echo My home dir is $HOME,echo My home dir is $HOME,第,6,章 第,30,页,转义符与引号及反撇号,配对的双引号中,代替双引号自身,代表反斜线自身,代替反撇号自身,$,代表美元符,自身,其它情况下的反斜线保持原文不变,echo A,与,echo A,echo $,与,echo $,配对的反撇号中,代表反斜线自身,代替反撇号自身,其它情况下的反斜线保持原文不变,配对的单引号,代表反斜线自身,不许任何转义,不许出现单引号,第,6,章 第,31,页,转义符使用举例,$,echo Dont remove Peters DOS dir C:PETER!,Dont remove Peters DOS dir C:PETER!,$,echo jiangs $HOME is $HOME,jiangs $HOME is /usr/jiang,$,echo pipeline is commands separated by |,pipeline is commands separated by |,6,条件判断,第,6,章 第,33,页,条件,条件判定的依据,判定一条命令是否执行成功,判断方法,:,命令执行的返回码,,0:TRUE(,成功,),,非,0:FALSE(,失败,),$,ls -d xyz,xyz,$,echo $?,$?,上一命令的返回码,,shell,自定义变量,0,$,ls -d xyz1,xyz1: not found,$,echo $?,2,用管道线连接在一起的若干命令的执行返回码为最后一个命令执行的返回码,第,6,章 第,34,页,最简单的条件判断,用,&,或,|,连结两个命令,cmd1,&,cmd2,若,cmd1,执行成功,(,返回码为,0),则执行,cmd2,,否则不执行,cmd2,cmd1,|,cmd2,cmd1,执行失败,(,返回码不为,0),则执行,cmd2,,否则不执行,cmd2,$,ls -d xdir /dev/null & echo FOUND,FOUND,若没有目录,ydir,$,ls -d ydir /dev/null 2&1 |echo No ydir,No ydir,第,6,章 第,35,页,命令,test,与,区别,命令,/usr/bin/,要求其最后一个命令行参数必须为,除此之外,/usr/bin/,与,/usr/bin/test,功能相同,Linux,中,/usr/bin/,是一个指向,test,的符号连接,注意:不要将方括号理解成一个词法符号,举例,test -r /etc/motd,-r /etc/motd,第,6,章 第,36,页,命令,test,:文件特性检测,文件特性检测,-f,普通文件,-d,目录文件,-r,可读,-w,可写,-x,可执行,-s,size0,例,test -r /etc/motd & echo readable, -r /etc/motd & echo readable,第,6,章 第,37,页,命令,test,:字符串和整数,字符串比较,-n,str,str,串长度大于,0,str1,=,str2,str1,与,str2,串相等,str1,!=,str2,str1,串与,str2,串不等,注意,:,等号和不等号两侧的空格不可少, -n $a | echo a=NULL,注意,:$a,的引号,test $# = 0 & echo No argument,整数的比较,-eq,-ne,-gt,-ge,-lt,-le,例,:,test ls | wc -l -ge 100 & echo Too many files,第,6,章 第,38,页,命令,test,:逻辑运算,逻辑运算,!,NOT,(非),-o,OR,(或),-a,AND,(与),例,:,!-d $cmd -a -x $cmd & $cmd,注意:必需的空格不可省略,$,cat here,echo ”count=$#”, $#=2 & echo Here,$,./here *.c,count=9,Here,第,6,章 第,39,页,复合命令,复合命令:条件满足时,执行若干个命令,使用, ,或者,( ),pwd,DIR=/usr/bin, -d $DIR & ,cd $DIR,echo ”Current Directory is pwd”,echo ”ls | wc -l files”,pwd,执行结果,/usr/jiang,Current Directory is /usr/bin,400 files,/usr/bin,第,6,章 第,40,页, ,与,( ),与,(),的书写规则,(,list,),在子,shell,中执行命令,表,list,list,;,在,当前,shell,中执行命令表,list,注意,:,左花括号后面必须有一个空格,与,(),的区别,如果将上例中的,改成,(),,那么执行结果如下,:,/usr/jiang,Current Directory is /usr/bin,400 files,/usr/jiang,第,6,章 第,41,页,复合命令:举例,使用,时,多行并为一行不要漏掉必需的空格和分号, -f core & ,echo rm core,rm core,写成一行应当为, -f core ,命令,expr,:表达式计算,功能:求表达式的值,shell,本身不提供数学运算和字符串运算的能力,这些运算借助命令,expr,完成,算数运算,+ - * / % (),注意,应该转义的地方必须加反斜线转义,应该有空格的地方不允许漏掉。,例,1:,求变量,a*(b+c),正确的写法为,expr $a * ( $b + $c ),命令,expr,:算数运算,(,例,),if $# = 0 ,then,echo Usage: $0 : ,else,count=$1,while $count -gt 0 ,do,count=expr $count - 1,echo -e 015 $count c,sleep 1,done,fi,()运算符的使用,(表达式1,表达式2),在双括号结构中,所有表达式可以像c语言一样,如:a+,b-等。,在双括号结构中,所有变量可以不加入:“$”符号前缀,双括号可以进行逻辑运算,四则运算,双括号结构 扩展了for,while,if条件测试运算,支持多个表达式运算,各个表达式之间用“,”分开,第,6,章 第,45,页,条件结构,if,语法,if,condition,then,list,elif,condition,then,list,else,list,fi,其中,if/then/elif/else/fi,为关键字,(,内部命令,),当条件判断后需要两个或多个分支时,,&,和,|,就不够了,这时应当用,if,结构,第,6,章 第,46,页,条件结构,if,:举例,$,cat errmonitor,LOGFILE=./errlog,date$LOGFILE,if test -w errfile,then,cat errfile$LOGFILE,rm errfile,else,echo ”No error”$LOGFILE,fi,then,行可和,cat,行合并成一行,if,行不可以和,then,行直接合并成一行,将两行合并,:,分号使得一行内可以输入多条命令,if test -r errfile; then,第,6,章 第,47,页,case,结构,基于文件名匹配基础上的多条件分支,语法,:,case,word,in,pattern1,),list1,;,pattern2,),list2,;,.,esac,word,与,pattern,匹配:使用,shell,的,文件名匹配规则,;,是一个整体,不能在两分号间加空格,也不能用两个连续的空行代替,可以使用竖线表示多个模式,word,与多个模式匹配时,执行遇到的第一个命令表,第,6,章 第,48,页,case,结构:举例,语法,case $1 in,START|start),.,(,一段程序,),;,STOP|stop),.,(,一段程序,),;,*),echo Usage: $0 start|stop,;,esac,注意:本例中,case,句中,$1,要加上双引号,7,循环结构,第,6,章 第,50,页,while,结构,语法,while,condition,do,list,done,例,1,while test -r lockfile,do,sleep 5,done,下例有错,while test -r lockfile do,sleep 5,done,例,2,while -r lockfile ; do sleep 5;done,第,6,章 第,51,页,for,结构,语法,1,for,name,in,word1 word2,.,do,list,done,语法,2,for,name,do,list,done,相当于,for,name,in $1 $2 .,do,list,done,第,6,章 第,52,页,for,结构:程序举例,1,例,1,:一段开机时自动执行的批处理程序,if -d /etc/rc.d ,then,for cmd in /etc/rc.d/*/* /etc/rc.d/*,do, ! -d $cmd -a -x $cmd & $cmd,done,fi,第,6,章 第,53,页,for,结构:程序举例,2,例,2,:将命令行参数逆序显示出来,list=” ”,for arg,do,list=”$arg $list”,done,echo ”$list”,第,6,章 第,54,页,break,内部命令,break,循环结构,for/while,中使用,中止循环,例,:,将命令行参数逆序输出,count=$#,cmd=echo,while true,do,cmd=”$cmd $count”,count=expr $count - 1, $count -eq 0 & break,done,eval $cmd,内部命令,eval,将实参作为,shell,的输入读入,再经过一轮变量替换,/,文件名生成,/,命令替换后,执行所得的命令,第,6,章 第,55,页,continue,内部命令,continue,在循环结构,for/while,中使用,提前结束本轮循环,例,:,将命令行参数逆序输出,count=$#,cmd=echo,while true,do,cmd=”$cmd $count”,count=expr $count - 1, $count -gt 0 & continue,eval $cmd,exit 0,done,内部命令,exit,终止当前,shell,进程,8,函数,第,6,章 第,57,页,shell,函数,语法,name,() ,list,;,参数,调用时函数名后附加上,0,到多个参数,在函数体内部以,$1,,,$2,,,.,或,$*,,,$,方式引用,返回值,函数体内用,return,使函数有返回码,返回码,0,代表成功,非零表示失败,函数内部可以创建和修改变量,函数返回后其它程序访问,第,6,章 第,58,页,Shell,的注释,shell,中使用,#,号作注释,#,号出现在一个单词的首部,那么,从,#,号至行尾的所有字符被忽略,第,6,章 第,59,页,shell,函数举例,get_val() # Usage: get_val,变量名 提示 默认值 取值表,while true,do,echo -e $2 $3 : c,;,read val, $val = & val=$3,for i in $4,do, $val = $i & break 2,done,echo * Invalid choice $val, must be in $4,done,eval $1=$val,# main(),get_val INTR Interrupt Number 10 5 10 11 12 14,get_val PORT I/O Base Address 800 512 560 800,get_val BAUD Baud Rate 9600 2400 9600 57600,echo INTR=$INTR PORT=$PORT BAUD=$BAUD,6.9 shell,开关和位置变量,第,6,章 第,61,页,shell,内部开关,shell,内部开关,-x,执行命令前打印,出,shell,替换后的,命令及参数,为区别于正常的,shell,输出,前面冠以,+,号,+x,取消上述设置,-u,当引用一个未定义的变量时,产生一个错误,+u,当引用一个未定义的变量时,认为是一个空串,-n,:不要执行,script,,仅查询语法的问题,第,6,章 第,62,页,shell,内部开关程序举例,例:,cat chmod1,set -x,echo $*,for i,do, -f $i & ,chmod a+r $i,eoho $i is readable,done,内部开关的设置方法,set -x,也可以省略,使用命令,sh -x chmodl a*,交互式,shell,也可以使用,set -x/set +x,使用,shell,的,-x,选项对,shell,程序调试非常有用,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!