[IT认证]shell 程序设计.ppt
《[IT认证]shell 程序设计.ppt》由会员分享,可在线阅读,更多相关《[IT认证]shell 程序设计.ppt(130页珍藏版)》请在三一办公上搜索。
1、第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、成。,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
3、 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子进程也终止。在这种方式
4、中,脚本是作为命令参数传给子Shell的。子Shell运行时读取该文件并执行其内容,因此脚本文件不必有执行权限。,(3)让当前Shell进程执行脚本文件:$.hello#注意.后面的空格“.”是一个Shell内部命令,hello是它的参数。“.”命令的功能是读取参数指定的文件,执行其内容。这种执行方式与第2种方式类似,区别在于此方式是由当前Shell进程来执行脚本文件的。,2.2 Shell特殊字符Shell定义了一些特殊的字符,称为元字符(meta-characters),它们对Shell有特殊的含义。Shell在读入命令行后,要先对命令行进行扫描,找出元字符并进行相应的替换或处理,以确定要
5、执行的程序和它的参数及执行方式等。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匹配
6、不为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表示标
7、准错误输出重定向。未指定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
8、文件:$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文档“”是一种特殊的标准输入重定向机制
9、,称为“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文档主要用在Sh
10、ell脚本中。它允许将脚本中某个命令的标准输入直接写在该命令行之后。这样,当执行到该命令行时,它不再去等待标准输入而是在本文档内(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 命令执行
11、控制符命令执行控制符用于控制命令的执行方式,指示Shell何时该执行这个命令以及在何处(前台、后台)执行这个命令。表2-3列出了常用的命令执行控制符。,1.顺序执行“;”是顺序执行符,它将两个或多个命令组合在一个命令行中,指示Shell顺序执行这些命令。例2.11 转到上一级目录,显示目录的路径名和目录的文件列表:$cd.;pwd;ls,2.条件执行“&”是逻辑与执行符,它将两个或多个命令组合在一个命令行中,指示Shell依次执行这些命令直到某个命令失败为止。“|”是逻辑或执行符,它将两个或多个命令组合在一个命令行中,指示Shell依次执行这些命令直到某个命令成功为止。例2.12 将文件fil
12、e1复制到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将多个命令组合在一起执行。组合的目的是对这些命令统一进行某种操作,如管道、后台运行、输入/输出重
13、定向等。命令的组合形式有两种:命令;命令;和(命令;命令;)。两种组合形式的区别在于前者只在本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进程执行命
14、令表/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 Thursda
15、y$Shell在解析这个命令行时遇到替换符,于是先执行了date命令,用它的输出替代了原date命令所在的位置,然后执行echo命令。,2.2.6 其他元字符表2-4列出了其他几个常用的元字符。,空格是命令行元素的分割符,它指示Shell如何识别和拆分完整的命令名、选项及参数。例2.20 使用注释符对命令进行说明:$echo hello#say hellohello$,2.2.7 元字符的引用当需要引用元字符的原始含义,而不是它的特殊含义时,就必须用引用符对它进行转义,消除其特殊含义。当Shell遇到引用符时,它将该引用符作用范围内的字符看作是普通字符。常用的引用符有3种,即转义符、单引号和双
16、引号。表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个和
17、第3个字符是转义符*$,2.3 Shell 变 量Shell提供了定义和使用变量的功能。用户可以将一些常用的数据存放在Shell变量中,并在命令行中引用这些变量。使用变量可以定制Shell的行为,方便Shell的使用和编程。2.3.1 变量的定义与使用变量是具有名字的一块内存空间,用于保存程序中要用到的数据。Shell是基于字符串的编程语言,Shell的变量只能存储字符串,因此Shell变量只有两种类型,即字符串和字符串数组。,1.定义变量在Shell中,对变量的定义与赋值是同时完成的。有3种方式可以为变量赋值:(1)用赋值命令,格式是:变量名=字符串注意:变量的名字必须以字母或下划线开头,可
18、以包括字母、数字和下划线。赋值号“=”两边不能有空格。如果字符串中含有空格,应用引号将字符串括起。,例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命令中定
19、义变量,用于进行循环控制。,2.引用变量引用变量即是求出变量的值(字符串),替换在发生引用的位置。引用变量的方法是在变量名前加引用字符“$”,格式是:$变量名 或$变量名当命令行中出现$字符时,Shell将紧跟其后面的字符串解释为变量名,并对其进行求值和替换。若$字符后面没有合法的变量名,则Shell将此$字符作为普通字符看待。,例2.24 在命令中引用变量:$dir=/home/cherry/cprogram$echo$dir#实际执行echo/home/cherry/cprogram/home/cherry/cprogram$cd$dir/hello#实际执行cd/home/cherry/
20、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”Th
21、is 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.清除变量用
22、unset命令清除变量。清除后的变量变为未定义变量,引用其值将得到空字符串。注意:只读变量是不能被清除的。unset命令的格式是:unset变量名变量名例2.27 清除变量:$unset dir$echo$dir$,2.3.2 变量的作用域变量的作用域是指变量可以被引用的范围。根据变量的作用域来划分,Shell变量可以分为两类,即本地变量和导出变量(也可称为局部变量和全局变量)。1.本地变量在一个Shell中定义的变量默认只在此Shell中才有意义,也就是说它们的作用是局部的。我们称这种变量为本地变量。本地变量只在本Shell中有定义,而在子Shell中是不存在的。,例2.28 本地变量的作用
23、域:$dir=/home/cherry/cprogram$echo$dir/home/cherry/cprogram$bash#进入子Shell$echo$dir(空串表示变量未定义)$,2.导出变量当Shell执行一个命令或脚本时,它通常会派生出一个子进程,由此子进程来执行命令。在很多情况下,我们希望Shell的变量在其子进程中也可以使用,这可以通过“导出(export)”操作,将Shell的变量传递给子进程。导出的变量称为导出变量,它与本地变量的区别在于导出变量可以被任何子进程引用,而本地变量仅在定义它的进程环境下才能使用。导出变量的命令是export,格式为:export 变量名变量名当
24、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
25、“$greeting$title$name!”#在本Shell中引用变量 Good morning Dr.Zhang!$,2.3.3 变量的分类根据用途和定义方式的不同,Shell变量可以大致分为3类,即用户变量、环境变量和特殊变量。按照作用域的不同,Shell变量又可以分为本地变量与导出变量两类。,图21 Shell变量的分类,用户变量、环境变量与特殊变量(1)用户变量:是由用户为实现某种应用目的而定义的变量。(2)环境变量:是由系统预定义的一组变量,用于为Shell提供有关运行环境的信息。环境变量定义在Shell的启动文件中,Shell启动后这些变量就已经存在了。(3)特殊变量:是由She
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IT认证 IT认证shell 程序设计 IT 认证 shell

链接地址:https://www.31ppt.com/p-4593867.html