欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    [IT认证]shell 程序设计.ppt

    • 资源ID:4593867       资源大小:721.50KB        全文页数:130页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    [IT认证]shell 程序设计.ppt

    第2章 Shell程序设计,2.1 Shell语言概述 2.2 Shell特殊字符 2.3 Shell变量 2.4 Shell表达式 2.5 Shell控制结构 2.6 Shell程序综合举例,2.1 Shell语言概述2.1.1 Shell语言的特点Shell语言具有如下特点:(1)Shell是一种解释性语言。用Shell语言写的程序不需编译,可以直接由Shell进程解释执行。比编译型语言执行时间慢。(2)Shell是基于字符串的语言。Shell只是做字符串处理,不支持复杂的数据结构和运算。Shell的输出也全部是字符方式的。(3)Shell是命令级语言。Shell程序全部由命令而不是语句组成。,2.1.2 Shell程序Shell程序也称Shell脚本(script),是由一系列Shell命令为基本元素构成的文本文件。简单的Shell程序可以只是一个命令序列,高级Shell程序中还可以包含复杂的命令组合,定义各种参数和变量、使用条件命令、控制结构以及其他高级特性。例2.1 第1个Shell程序:$cat hello#hello程序#This is a shell script to say hello.echo Hello World!,echo-n“Today is”date“+%A,%B%d,%Y.”$.hello#运行hello程序Hello World!Today is Saturday,October 13,2007.$,2.1.3 Shell程序的建立与执行Shell脚本是文本文件,因此可以用任何文本编辑器(如vi、emacs等)建立和编辑脚本。Shell脚本文件的名称没有限定的扩展名,通常不带扩展名或带“.sh”扩展名。Shell脚本的执行方式主要有3种。(1)将脚本作为可执行文件执行:$chmod a+x hello$./hello,(2)启动一个Shell子进程来执行脚本文件:$bash hello#或bash hello执行此命令行时,Shell进程先启动一个bash子进程,让它执行hello脚本的内容,执行完毕后bash子进程也终止。在这种方式中,脚本是作为命令参数传给子Shell的。子Shell运行时读取该文件并执行其内容,因此脚本文件不必有执行权限。,(3)让当前Shell进程执行脚本文件:$.hello#注意.后面的空格“.”是一个Shell内部命令,hello是它的参数。“.”命令的功能是读取参数指定的文件,执行其内容。这种执行方式与第2种方式类似,区别在于此方式是由当前Shell进程来执行脚本文件的。,2.2 Shell特殊字符Shell定义了一些特殊的字符,称为元字符(meta-characters),它们对Shell有特殊的含义。Shell在读入命令行后,要先对命令行进行扫描,找出元字符并进行相应的替换或处理,以确定要执行的程序和它的参数及执行方式等。Shell的元字符包括:文件通配符、输入/输出重定向及管道符、注释符、命令执行控制符、命令组合与替换符、转义符等。,2.2.1 通配符通配符用于描述命令中的文件名参数。当Shell在命令的参数中遇到带有通配符的文件名模式时,它将目录中的所有文件与该模式进行匹配,并用匹配的文件名替换参数中的文件名模式。表2-1列出了常用的通配符。,例2.2 通配符的匹配作用:zip*匹配以字符zip开始的任何字符串;*zip匹配以字符zip结尾的任何字符串;rc?.d匹配以rc开始、以.d结束,中间为任何单个字符的字符 串;a-d,x,y匹配字符a、b、c、d、x、y;!Z匹配不为Z的单个字符;a-f*匹配字符a到f开头的字符串,如abc,d2,e3.c,f.dat;*!o匹配不以o结尾的字符串。,2.2.2 输入/输出重定向与管道符输入/输出重定向和管道符的作用是改变命令的输入/输出环境。当Shell在命令行中遇到输入/输出重定向或管道符时,它将对命令的标准输入/输出文件作相应的更改,然后再执行命令。表2-2列出了常用的输入/输出重定向与管道符。,1.标准输入/输出重定向“”是标准输出重定向符,它将标准输出重定向到一个文件。为了区分是哪种输出重定向,可以在符号前加一个文件描述符fd。stdout的fd是1,stderr的fd是2,所以1表示标准输出重定向,2表示标准错误输出重定向。未指定fd时,默认地表示是1。例2.3 将标准输入改为infile,标准输出改为outfile,标准错误输出改为errfile文件:$myproc outfile 2errfile infile,2.合并重定向与归并重定向“&”是标准输出合并重定向符,它将标准输出与标准错误输出合在一起重定向到一个文件。“&”是标准输出归并重定向符,它将一种标准输出归并到另一种标准输出流中。符号的前后各用一个fd来表示归并的方式。1&2表示将stdout归并到stderr流中,&2默认地表示是1&2。2&1表示将stderr归并到stdout流中。例2.4 将标准输出和标准错误输出改向到out文件:$myprog&out,例2.5 将标准输出改向到out文件,并将标准错误输出并入到标准输出中:$myprog out 2&1#等价于myprog&out例2.6 将标准输出并入标准错误输出流:$myprog 1&2#避免标准输出被管道改向,3.附加重定向“”是标准输出附加重定向符,它将标准输出stdout或标准错误输出stderr用追加的方式重定向到一个文件。1或表示stdout附加重定向,2表示stderr附加重定向。例2.7 在.bash_profile文件的尾部添加一行:$echo PATH=$PATH:.bash_profile4.here文档“”是一种特殊的标准输入重定向机制,称为“here文档(here document)”。here文档的表示格式是“结束标记字符串”,它的作用是指示Shell将本命令行后面的输入行作为命令的标准输入传给命令,直到遇到结束标记字符串为止。,例2.8 here文档的使用:$sort Jone Doe David Nice Masood Shah EndDavid NiceJone DoeMasood Shah$cat here-doctestsort End,Jone DoeDavid NiceMasood ShahEnd$.here-doctestDavid NiceJone DoeMasood Shah$here文档主要用在Shell脚本中。它允许将脚本中某个命令的标准输入直接写在该命令行之后。这样,当执行到该命令行时,它不再去等待标准输入而是在本文档内(here文档)直接获取输入进行处理,如上例中here-doctest脚本所示。,5.管道“|”是管道符,它将前一命令的标准输出作为后一命令的标准输入。“|tee”是T型管道符,它将前一命令的标准输出存入一个文件中,并传递给后一命令作为标准输入。例2.9 将一个目录下的文件列表按名逆序排序后浏览:$ls/dev|sort-r|more例2.10 将一个文件的内容排序后保存并统计其行数:$sort mylist|tee sort-list|wc-l,2.2.3 命令执行控制符命令执行控制符用于控制命令的执行方式,指示Shell何时该执行这个命令以及在何处(前台、后台)执行这个命令。表2-3列出了常用的命令执行控制符。,1.顺序执行“;”是顺序执行符,它将两个或多个命令组合在一个命令行中,指示Shell顺序执行这些命令。例2.11 转到上一级目录,显示目录的路径名和目录的文件列表:$cd.;pwd;ls,2.条件执行“&”是逻辑与执行符,它将两个或多个命令组合在一个命令行中,指示Shell依次执行这些命令直到某个命令失败为止。“|”是逻辑或执行符,它将两个或多个命令组合在一个命令行中,指示Shell依次执行这些命令直到某个命令成功为止。例2.12 将文件file1复制到file2,如果成功则删除file1:$cp file1 file2&rm file1例2.13 将文件file1复制到file2,如果失败则显示file1:$cp file1 file2|cat file1,3.后台执行“&”是后台执行符,它指示Shell将该命令放在后台执行。后台执行的命令不占用终端与用户交互,因此Shell在执行后台命令后可以立即返回提示符。例2.14 在后台运行yes命令,丢弃输出:$yes/dev/null&,2.2.4 命令组合符命令组合符的作用是指示Shell将多个命令组合在一起执行。组合的目的是对这些命令统一进行某种操作,如管道、后台运行、输入/输出重定向等。命令的组合形式有两种:命令;命令;和(命令;命令;)。两种组合形式的区别在于前者只在本Shell中执行命令列表,不派生新的Shell子进程,命令执行的结果会影响当前的Shell环境;后者是派生一个新的子Shell进程来执行命令列表,命令在子Shell环境中执行,其执行的结果不会影响当前的Shell环境。,例2.15 在后台顺序执行两命令,5分钟后跳出提示信息“Tea is ready”:$(sleep 300;echo Tea is ready)ls/usr/bin|wc-l,例2.18 两种括号的区别:$pwd/home/cherry$cd book;pwd#由本Shell进程执行命令表/home/cherry/book$pwd/home/cherry/book(本Shell进程的当前目录改变了)$(cd.;pwd)#生成一个子Shell进程执行命令表/home/cherry(子进程的当前目录已改变)$pwd/home/cherry/book(本Shell进程的当前目录没有变)$,2.2.5 命令替换符当一个字符串被括在反撇号“”中时,该字符串将先被Shell作为命令解释执行,然后用命令执行后的输出结果替换字符串。例2.19 命令替换符的用法:$echo Today is date+%A#替换后为echo Today is ThursdayToday is Thursday$Shell在解析这个命令行时遇到替换符,于是先执行了date命令,用它的输出替代了原date命令所在的位置,然后执行echo命令。,2.2.6 其他元字符表2-4列出了其他几个常用的元字符。,空格是命令行元素的分割符,它指示Shell如何识别和拆分完整的命令名、选项及参数。例2.20 使用注释符对命令进行说明:$echo hello#say hellohello$,2.2.7 元字符的引用当需要引用元字符的原始含义,而不是它的特殊含义时,就必须用引用符对它进行转义,消除其特殊含义。当Shell遇到引用符时,它将该引用符作用范围内的字符看作是普通字符。常用的引用符有3种,即转义符、单引号和双引号。表2-5列出了它们的含义。,例2.21 在命令行中引用元字符:$echo“*is a wildcard.”#消除*字符的特殊含义*is a wildcard.$echo The prompter is“$”#消除双引号字符的特殊含义The prompter is“$”$echo“Dont do that!”#消除单引号字符的特殊含义Dont do that!$echo“Name ID Age Class”#消除空格符的特殊含义Name ID Age Class$echo Name ID Age Class#未转义的空格被看作是分隔符Name ID Age Class$echo*#第1个和第3个字符是转义符*$,2.3 Shell 变 量Shell提供了定义和使用变量的功能。用户可以将一些常用的数据存放在Shell变量中,并在命令行中引用这些变量。使用变量可以定制Shell的行为,方便Shell的使用和编程。2.3.1 变量的定义与使用变量是具有名字的一块内存空间,用于保存程序中要用到的数据。Shell是基于字符串的编程语言,Shell的变量只能存储字符串,因此Shell变量只有两种类型,即字符串和字符串数组。,1.定义变量在Shell中,对变量的定义与赋值是同时完成的。有3种方式可以为变量赋值:(1)用赋值命令,格式是:变量名=字符串注意:变量的名字必须以字母或下划线开头,可以包括字母、数字和下划线。赋值号“=”两边不能有空格。如果字符串中含有空格,应用引号将字符串括起。,例2.22 用变量赋值命令定义变量:$nodehost=beijing.WEB$user=“zhang ming”$path=/bin:/usr/bin:/etc/bin$count=10(2)用read命令,从标准输入读入字符串赋给变量,格式是:read变量名 变量名,例2.23 定义3个变量并为它们输入值:$read usera userb userc joe zhao ming$执行该read命令时,它将等待用户的输入。用户为每个变量输入一个字符串值,中间用空格分开。(3)在for命令中定义变量,用于进行循环控制。,2.引用变量引用变量即是求出变量的值(字符串),替换在发生引用的位置。引用变量的方法是在变量名前加引用字符“$”,格式是:$变量名 或$变量名当命令行中出现$字符时,Shell将紧跟其后面的字符串解释为变量名,并对其进行求值和替换。若$字符后面没有合法的变量名,则Shell将此$字符作为普通字符看待。,例2.24 在命令中引用变量:$dir=/home/cherry/cprogram$echo$dir#实际执行echo/home/cherry/cprogram/home/cherry/cprogram$cd$dir/hello#实际执行cd/home/cherry/cprogram/hello$pwd/home/cherry/cprogram/hello$echo$dir#这里的$被看作普通字符$dir$,注意:(1)引用未定义的变量将得到一个空字符串。(2)若变量名后紧随有字母、数字或下划线,则应将变量名用括起。,例2.25 引用变量的方法:$echo$dir_1#dir_1变量未定义,实际执行echo(空串)$echo$dir_1#实际执行echo/home/cherry/cprogram_1/home/cherry/cprogram_1$str=“This is a string”$echo“$strent test of variables”This is a stringent test of variables$echo“$strent test of variables”#实际执行echo“test of variables”test of variables$,3.设置只读变量为了防止变量的值被修改(也就是被重新赋值),可以用readonly命令将变量设置为只读的。readonly命令的格式是:readonly 变量名 变量名例2.26 设置只读变量:$readonly dir$dir=/home/cherry/project#对只读变量进行赋值bash:dir:readonly variable(赋值失败)$,4.清除变量用unset命令清除变量。清除后的变量变为未定义变量,引用其值将得到空字符串。注意:只读变量是不能被清除的。unset命令的格式是:unset变量名变量名例2.27 清除变量:$unset dir$echo$dir$,2.3.2 变量的作用域变量的作用域是指变量可以被引用的范围。根据变量的作用域来划分,Shell变量可以分为两类,即本地变量和导出变量(也可称为局部变量和全局变量)。1.本地变量在一个Shell中定义的变量默认只在此Shell中才有意义,也就是说它们的作用是局部的。我们称这种变量为本地变量。本地变量只在本Shell中有定义,而在子Shell中是不存在的。,例2.28 本地变量的作用域:$dir=/home/cherry/cprogram$echo$dir/home/cherry/cprogram$bash#进入子Shell$echo$dir(空串表示变量未定义)$,2.导出变量当Shell执行一个命令或脚本时,它通常会派生出一个子进程,由此子进程来执行命令。在很多情况下,我们希望Shell的变量在其子进程中也可以使用,这可以通过“导出(export)”操作,将Shell的变量传递给子进程。导出的变量称为导出变量,它与本地变量的区别在于导出变量可以被任何子进程引用,而本地变量仅在定义它的进程环境下才能使用。导出变量的命令是export,格式为:export 变量名变量名当Shell的一个子进程开始运行时,它继承了该Shell进程的全部导出变量。子进程可以修改继承来的变量的值,但修改只是对自己的变量副本进行,不影响父进程中的变量的值。,例2.29 导出变量与本地变量的使用:$name=Zhang;export name#定义并导出变量name$title=Dr.;export title#定义并导出变量title$greeting=“Good morning”#定义变量greeting$cat var_testname=Wangecho“$greeting$title$name!”$bash var_test#在子Shell中引用变量 Dr.Wang!$echo“$greeting$title$name!”#在本Shell中引用变量 Good morning Dr.Zhang!$,2.3.3 变量的分类根据用途和定义方式的不同,Shell变量可以大致分为3类,即用户变量、环境变量和特殊变量。按照作用域的不同,Shell变量又可以分为本地变量与导出变量两类。,图21 Shell变量的分类,用户变量、环境变量与特殊变量(1)用户变量:是由用户为实现某种应用目的而定义的变量。(2)环境变量:是由系统预定义的一组变量,用于为Shell提供有关运行环境的信息。环境变量定义在Shell的启动文件中,Shell启动后这些变量就已经存在了。(3)特殊变量:是由Shell自定义的一组变量,用于记录Shell当前的运行状态的一些信息,如运行参数、进程号等。特殊变量是本地的、只读的,用户可以引用这些变量,但不能修改它们的值,也不能导出它们。,2.本地变量与导出变量本地变量包括那些没有被导出的用户变量和环境变量,以及所有的特殊变量。根据作用域的规则,这些变量只能在本Shell中使用。导出变量包括那些导出的用户变量和环境变量。这些导出的变量既可以在本Shell中使用,也可以被本Shell的所有子进程使用。大多数的环境变量都是导出的,用户变量根据需要决定是否导出。所有的特殊变量都是本地的。,2.3.4 环境变量1.环境与环境变量Shell执行时需要了解一些有关系统和用户的基本信息,比如系统名、用户名、终端类型、使用的语言以及其他默认选项等。这些信息以变量的形式提供,称为环境变量。环境变量的全体就称为Shell的执行环境。通常,环境变量是系统预定义的,是对Shell运行环境的标准设置。不过用户也可以根据需要添加自己的环境变量,实现对Shell的运行环境的特殊设置。系统环境变量的名称全部是大写的,它们是系统预留的,不能用做它用。表2-6列出了常用的几个系统预定义的环境变量。,2.环境变量的定义环境变量定义在Shell的启动配置文件中,主要的文件有/etc/profile、/.bash_profile和/.bashrc。Shell启动时通过执行这些配置文件建立起运行环境。启动完成后,这些环境变量都已经被赋予相应的值。在随后的Shell执行过程中,用户可以直接使用这些变量。用户也可以通过编辑配置文件来定制自己的Shell环境,如添加自己的环境变量或修改系统环境变量的初值。,例2.30 在/etc/profile文件中定义的部分环境变量:#/etc/profileUSER=“id-un”LOGNAME=USERMAIL=“/var/spool/mail/$USER”HOSTNAME=/bin/hostnameexport USER LOGNAME MAIL HOSTNAME,3.环境变量的使用Shell启动后,用户可以直接引用环境变量,也可以对它们重新赋值。对环境变量的修改只在本次Shell会话中有效,若要使修改长久有效则需要修改启动配置文件。例2.31 在Shell中引用和修改环境变量:$echo“Hello$LOGNAME!”#使用LOGNAME变量Hello cherry!$echo$PATH#显示PATH变量的当前值/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/cherry/bin$myprog#运行当前目录下的一个程序 bash:myprog:command not found(找不到命令),$./myprog#指定命令的路径,运行程序(执行命令)$PATH=$PATH:.#修改PATH变量,使其包含当前目录$echo$PATH/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/cherry/bin:.$myprog#Shell在当前目录下搜索到命令(执行命令)$echo PS1 is“$PS1”,PS2 is“$PS2”PS1 is“$”,PS2 is“”$cat namelist#将后续行的输入写入namelist文件 Jone Doe David Nice Masood ShahEnd,$PS1=“$USER$HOSTNAME$”#修改主命令提示符$PS2=!#修改次命令提示符cherryfc9.localdomain$cat namelist!Jone Doe!David Nice!Masood Shah!Endcherryfc9.localdomain$,4.Shell命令的执行环境所有导出的环境变量和用户变量都可以被Shell的子进程继承使用,它们构成了Shell命令的执行环境。Shell命令的可执行代码有两种形式,即脚本文件和二进制的可执行代码,它们均以Shell的子进程方式运行。命令子进程通过访问命令执行环境可以获取有关运行环境的信息,并将其应用在自己的处理逻辑中。因此,通过对导出变量的设置可以改变Shell下的命令的执行环境,从而影响命令的执行结果。命令程序访问执行环境的方法是:脚本程序可以直接引用或修改其执行环境中的变量;C程序可以用setenv()和getenv()函数访问其执行环境中的变量。,例2.32 在脚本中访问执行环境:$WORKDIR=$HOME/project/src;export WORKDIR$cd/scripts$cat env_testecho“I am$LOGNAME$HOSTNAME.”cd$WORKDIRecho“I am now in$PWD.”$./env_testI am cherryfc9.localdomain.I am now in/home/cherry/project/src.$echo$PWD/home/cherry/scripts$,2.3.5 特殊变量Shell中有一组预定义的特殊的变量,其功能是记录Shell当前的运行状态的一些信息,主要包括运行参数、进程标识和命令退出状态等。特殊变量的变量名和值由Shell自动设置。特殊变量都是只读变量,因此在程序中可以引用这些变量,但不能直接对它们赋值。表2-7列出了几个常用的特殊变量。注意:由于都是只读变量,表2-7中列出的是变量的引用表达式,而不是变量名。用户可以用$*、$#等来引用变量,但不能将*或#等看作为变量名来进行赋值、导出等操作。,1.参数变量向Shell脚本传递数据的途径有两种,一种是通过导出变量,另一种是通过命令行参数。Shell在解析命令行时首先将命令的参数识别出来,存入专门设置的变量中,这些记录运行参数的变量就称为参数变量。命令在其执行期间可以直接引用这些变量,获得此次运行的参数。参数变量主要有以下几个:(1)$#:记录命令行参数的个数。(2)$*:记录命令行的整个参数。(3)$:记录了命令行的各个参数。,(4)$i:称为位置变量,是按位置记录命令参数的一组变量,分别为$0,$1,$2,$9,$10,。其中,$0为命令名本身,$1为命令的第1个参数,$2为命令的第2个参数,。所有超过参数个数的位置变量i(i$#)的值为空字符串。例如,某个命令的名称为myprog,执行时的命令行是myprog-s“How are you!”joe jean。当该命令被执行时,Shell隐含地为它建立起一系列的参数变量,各参数变量的内容如下:$#:4$0:myprog$1:-s,$2:How are you!$3:joe$4:jean$*:-s How are you!joe jean“S*”:“-s How are you!joe jean”$:-s How are you!joe jean“$”:“-s”“How are you!”“joe”“jean”,例2.33 在程序中引用参数变量:$cat var_testecho My name is$0,I have$#parameters,they are$echo The first of them is“$1”$./var_test How are youMy name is var_test,I have 3 parameters,they are How are youThe first of them is“How”$./var_test“How are you”cherryMy name is var_test,I have 2 parameters,they are How are you cherryThe first of them is“How are you”$,2.设置参数变量参数变量是只读的,因此用户不能直接对参数变量重新赋值,但却可以通过Shell提供的命令来设置这些变量。1)用set命令设置位置变量用set命令可以对位置变量及其他参数变量强制赋值,对位置变量赋值后,参数变量$#、$、$*等也相应地被重新赋值。格式:set字符串1字符串2其中,字符串i是要赋给第i个位置变量的值。注意:set不能对$0赋值。,用set-命令可以清除所有的位置变量。相应地,$和$*变量也被清除,$#变量被清0。例2.34 设置位置变量:$date五 10月 24 12:08:05 CST 2008$set date$echo$6$2$3$12008 10 月 24 五$date命令输出了6个字符串,它们被依次赋给了$1$6变量。随后的echo命令显示了其中的4个变量。,2)用shift命令移动位置变量shift命令的功能是将位置变量与命令行参数的对应关系右移指定的位数,同时将$#变量的值减去相应的数,$、$*等也相应地被重新赋值。注意:shift只移动$1及其后面的位置变量的值,$0变量的值保持不变。格式:shift 位移量未指定位移量参数时,右移1位。,例2.35 用shift命令移动位置变量的值:$cat proc1echo$0;$#;$1;$2;$3;$4;$5;shiftecho$0;$#;$1;$2;$3;$4;$5;shift 2echo$0;$#;$1;$2;$3;$4;$5;$bash proc1 A B C D Eproc1;5;A;B;C;D;E;proc1;4;B;C;D;E;proc1;2;D;E;$,3.其他特殊变量其他常用的特殊变量包括纪录命令退出状态的$?变量和纪录进程PID的$、$!变量等。1)退出状态变量在Linux系统中,每个命令在执行结束退出时都要返回给系统一个状态值。例如在C程序中是调用exit(status)函数退出,在Shell脚本中则是用exit status命令退出。其中的status就是返回给系统的状态值。通常的约定是,程序成功结束时返回0状态值;程序出错时返回非0的状态值(比如1、2、1等)。,$?变量记录了最近一条命令执行结束后的退出状态。当一个命令子进程退出时,它调用exit(status)将退出状态码放入自己的PCB中。随后,Shell处理子进程的善后工作,将它的退出状态码保存在$?变量中。如果该命令执行成功后退出则$?为0,否则为非0。Shell通过$?来判断上一条命令的成功与否。例如,在进行逻辑与执行“命令1&命令2”和逻辑或执行“命令1|命令2”时,Shell就是通过命令1执行后的$?值来决定是否执行命令2。,例2.36 从$?变量获得命令的退出状态:$rm file1$echo$?0(删除文件成功)$rm file2rm:cannot remove file2:No such file or directory$echo$?1(删除文件失败)$,2)命令的进程号$变量记录了本命令的执行进程的进程号PID。当一个命令以子进程的方式开始运行时,Shell将它的进程号PID存入到它的$变量中。命令程序中可以引用该变量,但不能修改它。另外一个可能用到的变量是$!变量,它记录了当前作业(即最后一个进入后台的那个作业)的PID。例2.37 从$变量获得命令的进程号:$echo$0,$#显示本Shell进程的命令名和PIDbash,15452$sleep 30&1 4439,$echo$!4439$cat pid_testecho“My name is$0,my PID is$.”$pid_test#以子进程方式执行脚本My name is pid_test,my PID is 16620.$.pid_test#由本Shell进程执行该脚本My name is bash,my PID is 15452.$从上例可以看出,当以命令方式直接运行脚本时,它是由一个子进程执行的,具有自己的PID;当用“.”命令执行脚本时,它是由本Shell进程执行的,其报出的PID就是本Shell进程的PID。,2.4 Shell表达式Shell语言支持表达式计算。Shell表达式主要有两种形式,一是用于数值计算的算术表达式,其结果是数值;另一种是用于进行条件测试或判断的逻辑表达式,其结果是真假值。,2.4.1 数字运算表达式与高级语言中的变量不同,Shell变量只有字符类型,它们只能存放整数数字字符串,如“127”等。Shell本身也没有数字运算的能力,必须借助某些命令来进行算术运算。expr就是用来进行数字表达式计算的命令。expr命令【功能】计算表达式。【格式】expr 数值1 运算符 数值2【参数】expr支持以下运算符:+、*、/、%加、减、乘、除、取余。,&、|逻辑与、逻辑或。=、=、!=等于、恒等于、不等于。、=、=大于、小于、大于等于、小于等于。【输出】+、-、*、/、%运算输出结果数值;&运算当两个数值都非0时输出第1个数值,否则输出0;|运算当第1个数值非0时输出第1个数,否则输出第2个数;比较运算为真时输出1,否则输出0。【退出状态】算术运算返回状态0;逻辑和比较运算结果为真(非0)时返回状态0,为假(0)时返回状态1;出错时返回状态2。,【说明】(1)运算符两侧必须留有空格,与运算数分开。(2)算术运算的数值必须是整数,可以是数字字符串常量(如“123”),也可以是数字字符串变量(如$a)。expr命令负责将数字字符串解释为整数,然后进行运算。(3)运算符如果是Shell的元字符,如*、&、|、等,必须用转义符使其失去特殊意义,不被Shell解释执行。,例2.38 expr命令用法示例:$a=13$expr“$a”-4+2#13-4+2,注意运算符两旁要留有空格11$expr 4*5#4*520$expr 5+7/3#5+7/3,/运算优先于+运算,结果取整7$expr expr 5+7/3#(5+7)/3,用命令替换改变运算次序4$expr$a=3;echo$?#13=3?10,$expr 5 echo$?#5 or 1350$a=expr$a-2#替换后为a=11$echo$a11$,2.4.2 逻辑测试表达式test命令可对字符串、整数及文件进行各类测试。test命令并不输出任何结果,而是用退出状态来表示测试的结果:退出状态为0时表示test成功,测试结果为真;退出状态为1表示test失败,测试结果为假。test的测试结果用于在控制结构中进行条件判断。test命令使用的表达式形式见表2-8。,test命令【功能】测试表达式的真假值。【格式】test有两种等价的格式:test 表达式 表达式(注意“”和“”两侧的空格)。【参数】表达式的常用形式见表2-8。【退出状态】测试结果为真时返回状态0;为假时返回状态1;出错时返回状态2。【说明】(1)运算符两侧必须留有空格,与运算数分开。(2)表达式中若使用Shell的元字符,如、(、)等,必须用转义符“”使其失去特殊意义,不被Shell解释执行。,1.字符串测试例2.39 字符串测试:$user=smith$test“$user”=smith#两字符串相等?$echo$?#显示测试结果0(是)$test-z“$user”#字符串为空串?$echo$?1(否),例2.40 含有空格的字符串及空字符串的测试:$user1=“Tom Smith”$test“$user1”=“Tom Smith”#test“Tom Smith”=“Tom Smith”$echo$?0(真)$test$user1=“Tom Smith”#test Tom Smith=“Tom Smith”bash:test:too many arguments$echo$?2(出错)$test“$user2”=smith#test“”=smith$echo$?1(假),$test$user2=smith#test=smithbash:test:=:unary operator expected$echo$?2(出错)$,2.数字测试表达式例2.41 数字比较测试:$x1=5$test“$x1”-eq 5;echo$?#test“5”=50(真)$,3.文件测试表达式例2.42 文件测试:$test-f/home/cherry/message;echo$?#检查指定的文件是否存在0(真)$gcc myprog.c 2err#编译,错误信息记入err文件$test-s err&echo“Errors found”#检查编译错误文件是否为空$第2个test命令测试为真时,表示有编译错误发生,继续执行echo命令;否则不执行。,例2.43 目录测试:$cat dir_testtest-d$1 exit 1$dir_test procproc is a directory$如果test-d$1命令测试为真,则顺序执行第1行的后两个命令,以0状态退出;如果测试为假,则执行第2行命令,以1状态退出。,4.逻辑测试表达式例2.44 带有逻辑运算符的表达式测试:$test-f file-a!-s file#测试file是否为空的普通文件$echo$?1(否)$read a b c(输入2 7 5)$test($a-eq 0-o$b-gt 5)-a$c-le 8#($a=0 or$b5)and($c=8)?$echo$?0(是),$cat check_input#测试输入的数字是否有效echo-n“Input a number(1-10):”read atest$a-lt 1-o$a-gt 10&echo error!&exit 1echo okexit 0$bash check_inputInput a number(1-10):5ok$bash check_inputInput a number(1-10):15error!$,2.5 Shell控制结构与C语言的控制结构语句类似,Shell提供了几个专门的内部命令来构造控制结构,用它们可以构造出任意的分支与循环。这些命令(有时也称为语句)可以分为以下几类:分支结构:if、case。循环结构:while、until、for。

    注意事项

    本文([IT认证]shell 程序设计.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开