第2章Shell程序设计-part1_第1页
第2章Shell程序设计-part1_第2页
第2章Shell程序设计-part1_第3页
第2章Shell程序设计-part1_第4页
第2章Shell程序设计-part1_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1本章重点1. shell 命令行的运行。2. 编写、权限修改和执行 shell 程序的步骤。3. 在 shell 程序中使用参数和变量。4. 表达式比较、循环结构语句和条件结构语句。5. 在 shell 脚本中使用函数。2shell编程简介q shell既是一种命令语言,又是一种程序设计语言 q作为 命令语言:交互地解释和执行用户输入的命令;作为 程序设计语言:定义了各种变量和参数,提供了许多高级语言才有的控制结构,例如循环和分支qshell是解释型语言,每条语句在执行的时候才翻译qshell程序又称为shell脚本3qShell虽不是Linux系统核心的组成部分,但它调用了系统核心的大部分

2、功能来执行程序并协调各个程序的运行。对于用户来说,shell是最重要的实用程序q深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统的关键。 shell编程简介4Bash简介p Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,其它Shell还包括tcsh、csh、ash、bsh、ksh等等。p Shell Script(Shell脚本)大致都类同,当您学会一种Shell以后,其它的Shell会很快就上手。p 在Bash脚本中第一行的“#!”及后面的“/bin/bash”表明该文件是一个Bash程序,需要由/bin目录下的bash程序

3、来解释执行。52.1 bash脚本的建立和运行脚本的建立和运行 2.1.1 shell命令行命令行 q 在执行shell命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令,例:rootlocalhost root# ls a* -l; free;df6 2.1.1 shell命令行命令行 q 长shell命令行可以使用反斜线字符()在命令行上扩充,例如:rootlocalhost root# echo this is long commandthis is long commandq 注意:“”符号是自动产生,而不是手工输入。72.1.2 bash脚本的建立脚本的建立qShe

4、ll编程有很多类似C语言和其他程序设计语言的特征,但是又没有编程语言那样复杂。qShell程序是指放在一个文件中的一系列Linux命令和实用程序,在执行的时候,通过Linux操作系统一个接着一个地解释和执行每条命令。82.1.2 bash脚本的建立脚本的建立 bash是许多Linux系统内定的shell. 编写bash脚本程序的两种方式:l 输入一系列命令l 把命令保存到一个文本文件,调用该文件(程序)l bash程序的每一行既可以是bash命令,又可以是bash语句1. 编辑编辑shell程序程序q 编辑一个名为myDate.sh的源文件并运行。q 注意:#!/bin/sh通知采用bash解

5、释,在echo语句中执行shell命令date可采用如下两种方式, %B%d%A为输出格式控制符。 92.1.2 bash脚本的建立脚本的建立#!表明紧跟其后的参!表明紧跟其后的参数是用来执行本文件数是用来执行本文件的程序的程序1. 编辑编辑shell程序(续)程序(续)q 注释行以#开始,直到该行结束q /bin/bash 是默认的shell程序 102.1.2 bash脚本的建立脚本的建立112.1.2 bash脚本的建立脚本的建立2. 建立可执行的二进制程序建立可执行的二进制程序q编辑完该文件之后不能立即执行该文件,需给文件设置可执行权限。使用如下命令:chmod +x myDate.s

6、h122.1.2 bash脚本的建立脚本的建立3. 执行shell程序 q 方法(1)q 方法(2)另外一种执行date的方法就是把它作为一个参数传给shell命令:132.1.2 bash脚本的建立脚本的建立q方法(3)为了在任何目录都可以编译和执行shell所编写的程序,需要把程序所在的目录添加到整个环境变量中。142.1.2 bash脚本的建立脚本的建立q方法(3) (续)经过export PATH=/home/jiantao/class2:$PATH 之后152.1.2 bash脚本的建立脚本的建立q 例2.1 编写一个shell程序:显示root下的文件信息,然后建立一个kk的文件夹

7、,在此文件夹下新建一个文件aa,修改此文件的权限为可执行。分析分析:此shell程序中需要依次执行命令:1. 进入root目录:cd /root2. 显示root目录下的文件信息:ls -l3. 新建文件夹kk:mkdir kk4. 进入root/kk目录:cd kk5. 新建一个文件aa:vi aa #编辑完成后需手工保存6. 修改aa文件的权限为可执行:chmod +x aa7. 回到root目录:cd /root162.1.2 bash脚本的建立脚本的建立 shell程序只是以上命令的顺序集合,假定程序名为shell21。172.1.2 bash脚本的建立脚本的建立 shell程序只是以

8、上命令的顺序集合,假定程序名为shell21。182.2 shell程序的位置参数与变量程序的位置参数与变量q Bash采用变量来存放数据,使用变量之前通常不需要声明q 默认情况下,所有变量都被看作字符串并以字符串格式存储,即使变量被赋值为数值(需要时,数值型字符串被转换为对应的数值)192.2 shell程序的位置参数与变量程序的位置参数与变量1. 位置参数位置参数q由系统提供的参数被称为位置参数。位置参数的值可以用$N得到,N是大于0的整数qLinux会把输入的命令字符串分段,并给每段进行标号q$0表示程序的名字,$1表示传递给程序的第一个参数,以此类推。202.2 shell程序的位置参

9、数与变量程序的位置参数与变量位置参数及内部参数说 明读写特性$0shell脚本的文件名字只读$1-$9命令行参数19的值只读$*命令行中所有的参数,”$*”表示各个参数之间用IFS(Internal Field Seprator,内部域分隔符)中的第一个字符分隔开只读$命令行中所有的参数,”$”不使用IFS,因此当IFS为空时,参数的值不会结合在一起。只读$#命令行参数的总个数只读$shell脚本进程的ID号只读$?最近一次命令的退出状态只读$!最近一次后台进程的ID号只读212. 内部参数内部参数q$0是一个内部变量,它是必须的q$1及$N则可有可无q最常用的内部变量有$0、$#、$?、$*

10、,含义分别为:$0 :命令或文件名字(含命令所在的路径)$# :传递给程序的总的参数数目$* :传递给程序的所有参数,与$有差异$? :shell程序在shell中退出的情况,正常退出返回0,反之为非0值2.2 shell程序程序的位置参数与变量的位置参数与变量22q 例2.2 编写shell程序,用于描述shell程序中的位置参数$0、$#、$?、$*,程序名为2.2.1.sh,代码如下:注意:命令或程序名称不计算在参数内,执行程序时需输入多个参数2.2 shell程序程序的位置参数与变量的位置参数与变量233. 位置参数的设置位置参数的设置q用set命令来设置位置参数的值,在处理命令替换的

11、时候非常有用。q格式:set options argument-listq使用在argument-list中的值来设置位置参数2.2 shell程序程序的位置参数与变量的位置参数与变量243. 位置参数的设置位置参数的设置q例如2.2 shell程序程序的位置参数与变量的位置参数与变量文件的index号253. 位置参数的设置位置参数的设置q例如2.2 shell程序程序的位置参数与变量的位置参数与变量262.2.2 环境变量和用户定义变量环境变量和用户定义变量qshell变量分为环境变量和用户定义变量q比较重要的环境变量:2.2 shell程序程序的位置参数与变量的位置参数与变量环境变量说

12、明$HOME当前用户主目录$PATH用以搜索命令之用的目录列表,以冒号分隔$PS1命令提示符,通常是$PS2二级提示符,用来提示后续的输入,通常是$IFS输入域分隔符,通常是空格、制表符、换行符272.2.2 环境变量和用户定义变量环境变量和用户定义变量q比较重要的环境变量(续):2.2 shell程序程序的位置参数与变量的位置参数与变量282.2.2 环境变量和用户定义变量环境变量和用户定义变量q用户定义的shell变量的名字可以包括数字、字母和下划线,且只允许以字母或下划线开头。q例如:age OS a1 _x1 等2.2 shell程序程序的位置参数与变量的位置参数与变量292.2.3

13、变量的声明和赋值变量的声明和赋值1.变量的声明p 变量不一定被声明,但特殊类型的变量需要被声明p 一个没有声明和初始化的变量的初值是一个空串p 一个bash变量默认是一个字符串,但是可以被人工定义为一个整型值p 亦可以把一个变量设置为只读属性2.2 shell程序程序的位置参数与变量的位置参数与变量302.2.3 变量的声明和赋值变量的声明和赋值1.变量的声明(续)p 使用格式:declare options name=valuetypeset options name=value常用选项options:-a 声明一个数组-f 声明一个函数-i 声明一个整数-r 声明只读变量-x 全局变量(每

14、个变量都可以被子进程访问到) 2.2 shell程序程序的位置参数与变量的位置参数与变量312.2.3 变量的声明和赋值变量的声明和赋值1.变量的声明:(续)变量的声明:(续)“=”前后不能有空格;前后不能有空格;2.2 shell程序程序的位置参数与变量的位置参数与变量322.2.3 变量的声明和赋值变量的声明和赋值2.变量的赋值变量的赋值使用格式:使用格式:variable=value 注:注:=前后无空格前后无空格一个整型变量不能被赋予非整形的值,例如一个整型变量不能被赋予非整形的值,例如2.2 shell程序程序的位置参数与变量的位置参数与变量332.2.3 变量的声明和赋值变量的声明

15、和赋值2. 变量的赋值(续)变量的赋值(续)2.2 shell程序程序的位置参数与变量的位置参数与变量342.2.4 变量引用和引号使用变量引用和引号使用1. 变量引用变量引用p 可以通过可以通过 $变量名变量名 访问变量的内容;访问变量的内容;p 变量名变量名=值值 则自动创建变量则自动创建变量2.2 shell程序程序的位置参数与变量的位置参数与变量352.2.4 变量引用和引号使用变量引用和引号使用1. 变量引用变量引用p 读取变量值的方法$variable 返回variable的值 $variable 返回variable的值2.2 shell程序程序的位置参数与变量的位置参数与变量3

16、62.2.4 变量引用和引号使用变量引用和引号使用1. 变量引用变量引用p 读取变量值的方法(续)$variable:-string 当variable存在且不是空值时返回变量的值,否则返回string2.2 shell程序程序的位置参数与变量的位置参数与变量372.2.4 变量引用和引号使用变量引用和引号使用1. 变量引用变量引用 p 读取变量值的方法(续)$variable:=string 当variable存在且不是空值时返回变量的值,否则把string赋值给variable并返回2.2 shell程序程序的位置参数与变量的位置参数与变量有赋值的含义382.2.4 变量引用和引号使用变量

17、引用和引号使用1. 变量引用变量引用 p 读取变量值的方法(续)$variable:?string 当variable存在且不是空值时返回变量的值,否则显示 变量名: string2.2 shell程序程序的位置参数与变量的位置参数与变量392.2.4 变量引用和引号使用变量引用和引号使用1. 变量引用变量引用 p 读取变量值的方法(续)$variable:+string 当variable存在且不是空值时返回string,否则返回null2.2 shell程序程序的位置参数与变量的位置参数与变量返回NULL402.2.4 变量引用和引号使用变量引用和引号使用1. 变量引用变量引用p 参数替换

18、参数替换$param%word 从尾部开始,删除匹配word的最小部分$param%word 从尾部开始,删除匹配word的最大部分2.2 shell程序程序的位置参数与变量的位置参数与变量412.2.4 变量引用和引号使用变量引用和引号使用1. 变量引用变量引用 (续)(续)p 参数替换参数替换$param#word 从首部开始,删除匹配word的最小部分$param#word从首部开始,删除匹配word的最大部分$#param 给出param的长度2.2 shell程序程序的位置参数与变量的位置参数与变量422.2.4 变量引用和引号使用变量引用和引号使用2. 双引号、单引号、反斜线的使用

19、双引号、单引号、反斜线的使用p 如果一个参数中包含一个或多个空白字符(空格、制表符、换行符),则需要给参数加引号p 双引号:可引用除 $、 之外的任意字符或字符串;如果用双引号将值括起来,则允许使用$对括号中的变量进行替换2.2 shell程序程序的位置参数与变量的位置参数与变量432.2.4 变量引用和引号使用变量引用和引号使用2. 双引号、单引号、反斜线的使用双引号、单引号、反斜线的使用p 双引号:(续)除了本身、$开头的变量、反引号内的函数、 开头反转换字符外, 其余都是直接输出.2.2 shell程序程序的位置参数与变量的位置参数与变量$* 即命令行中所有参数,默认为空442.2.4

20、变量引用和引号使用变量引用和引号使用2. 单引号、双引号和反斜线的使用(续)单引号、双引号和反斜线的使用(续)p 单引号:用单引号将值括起来,则不允许对括号中的变量进行替换,且不做shell解释,即屏蔽了括号中特殊字符的含义2.2 shell程序程序的位置参数与变量的位置参数与变量452.2.4 变量引用和引号使用变量引用和引号使用2. 单引号、双引号和反斜线的使用(续)单引号、双引号和反斜线的使用(续)p 单引号:(续)2.2 shell程序程序的位置参数与变量的位置参数与变量462.2.4 变量引用和引号使用变量引用和引号使用2. 单引号、双引号和反斜线的使用(续)单引号、双引号和反斜线的

21、使用(续)p 反斜线():去除某些字符(如$)的特殊含义并按照字面意思处理2.2 shell程序程序的位置参数与变量的位置参数与变量472.2.5 命令替换命令替换shell 把 $(command) 或 command 替换为命令的输出结果,例如2.2 shell程序程序的位置参数与变量的位置参数与变量返回variable的值,如果没有被初始化则返回null482.2.5 命令替换(续)命令替换(续)2.2 shell程序程序的位置参数与变量的位置参数与变量注:USER、PATH、PWD等被称为系统变量492.2.6 变量的输入变量的输入read命令将用户输入赋值给一个变量,命令的参数即变量

22、名程序执行到此语句时会等待用户输入数据输入完毕,按下回车时,read命令结束用法:read options variable-list2.2 shell程序程序的位置参数与变量的位置参数与变量502.2.6 变量的输入(续)变量的输入(续)2.2 shell程序程序的位置参数与变量的位置参数与变量等待输入512.2.6 变量的输入(续)变量的输入(续)2.2 shell程序程序的位置参数与变量的位置参数与变量等待输入52p bash具有一般高级程序设计语言常用的控制结构语句p if语句、case和if语句、循环结构(for、while、until语句)2.3 控制结构语句控制结构语句532.3

23、.1 顺序结构的语句顺序结构的语句2.3 控制结构语句控制结构语句542.3.2 if-then-elif-else-fi语句语句if语句三种格式:2.3 控制结构语句控制结构语句if athen bfiif athen belse cfiif a1then belif a2then celse dfi552.3.2 if-then-elif-else-fi语句语句例2.11 利用内部变量和位置参数编写文件删除程序,要求从终端输入文件名,例如./shell211 file2.3 控制结构语句控制结构语句562.3.2 if-then-elif-else-fi语句(续)语句(续)2.3 控制结构

24、语句控制结构语句572.3.2 if-then-elif-else-fi语句(续)语句(续)正确:正确: 正确:正确:错误:错误:解决办法:操作数和操作符或者括号的前后至少要留一个空格2.3 控制结构语句控制结构语句582.3.2 if-then-elif-else-fi语句(续)语句(续)正确:正确:2.3 控制结构语句控制结构语句592.3.2 if-then-elif-else-fi语句(续)语句(续)2.3 控制结构语句控制结构语句字符串比较结果string1 = string2如果两个字符串相同则结果为真,等号前后一般有空格string1 != string2如果两个字符串不同则结果

25、为真-n string如果字符串不为空则结果为真-z string如果字符串为空则结果为真算术比较结果expression1 eq expression2如果两个表达式相等则结果为真expression1 ne expression2如果两个表达式不等则结果为真expression1 gt expression2如果expression1大于expression2则结果为真expression1 ge expression2如果expression1大于或等于expression2则结果为真expression1 lt expression2如果expression1小于expression2

26、则结果为真expression1 le expression2如果expression1小于或等于expression2则结果为真! expression如果表达式为假则结果为真,反之亦然602.3.2 if-then-elif-else-fi语句(续)语句(续)2.3 控制结构语句控制结构语句文件条件测试结果-d file如果文件是一个目录则结果为真-e file如果文件存在则结果为真-f file如果文件是一个普通文件则结果为真-r file如果文件可读则结果为真-s file如果文件的长度不为0则结果为真-w file如果文件可写则结果为真-x file如果文件可执行则结果为真612.3

27、.2 if-then-elif-else-fi语句(续)语句(续)例:2.3 控制结构语句控制结构语句注意 = 及其前后的空格622.3.2 if-then-elif-else-fi语句(续)语句(续)例:2.3 控制结构语句控制结构语句632.3.2 if-then-elif-else-fi语句(续)语句(续)例2.13 编写程序shell213,让它接受一个命令行参数,并判断该参数是不是一个文件。若未给定参数,或参数个数大于1,或参数不代表一个普通文件,则返回出错信息。2.3 控制结构语句控制结构语句642.3.2 if-then-elif-else-fi语句(续)语句(续)例2.13 编

28、写程序shell213(续)2.3 控制结构语句控制结构语句652.3.2 if-then-elif-else-fi语句(续)语句(续)例2.14 判断Linux系统是否安装计算器,如已安装,执行计算器程序并进行算术运算。2.3 控制结构语句控制结构语句662.3.2 if-then-elif-else-fi语句(续)语句(续)例2.14 判断Linux系统是否安装计算器,如已安装,执行计算器程序并进行算术运算。(续)2.3 控制结构语句控制结构语句67 for结构可以用来循环处理一组值,这组值可以在程序中被简单列出;或与shell的文件名扩展结果结合使用。 for语句语法:for varia

29、ble in argument-listdocommand-listdone其中,argument-list中的词逐一被赋值给variable;有多少个词,循环体就被执行多少次。2.3.3 for语句语句68例2.15 循环变量被argument-list中的词逐个赋值2.3.3 for语句语句69例2.15(续)引号之内的内容被看做一个字符串的情形:2.3.3 for语句语句70IFS分隔符 IFS(Internal Field Separator)即“内部区域分隔符”,存储着默认的文本分隔符 默认是空格符、制表符、新行(newline)等 可以通过改变IFS的值来改变分隔符例2.16 IF

30、S分隔符的改变与还原2.3.3 for语句语句71例2.17 删除特定目录下的所有文件2.3.3 for语句语句72例2.17 删除特定目录下的所有文件2.3.3 for语句语句未加双引号,含有通配符*有删除信息输出73例2.17 删除特定目录下的所有文件2.3.3 for语句语句加双引号,含有通配符*,*不被扩展,有删除信息输出加双引号,含有通配符*,*不被扩展,无删除信息输出,(因为文件夹无法被删除)74例2.17 删除特定目录下的所有文件2.3.3 for语句语句使用ls命令,使用./exp指定目录,被删除时找不到文件75例2.17 删除特定目录下的所有文件2.3.3 for语句语句使用ls命令,使用./exp/指定目录,被删除时找不到文件76例2.17 删除特定目录下的所有文件2.3.3 for语句语句使用ls命令,使用./exp/*指定目录(其实仅列出文件),能输出文件删除信息77思考题:如何把回收站里的文件恢复到指定的目录?2.3.3 for语句语句78 例2.18 显示目录下所有.txt文件的内容2.3.3 for语句语句回顾一下,shell 把 $(command) 或 command 替换为命令的输出结果,这个过程被称为命令替换79例2.19 指定目录,输出该目录及子目录的大小,并将目录中文件的权 限都改为可执行2.3.3 for语句语句80例2.19(续)2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论