Shell编程实验指导
Shell编程实验
一、实验目的
了解 Shell 的作用和主要分类。
了解 Bash的一般语法规则。
练习编写简单的shell程序。
二、实验内容
1.Shell变量的定义及其使用。
2.位置参数和环境变量。
3.Shell中的特殊字符。
4.条件判断结构与循环结构
5.函数的定义和使用
三、预备知识
1、LINUX环境下常用命令和VI编辑器的操作。
2、了解Shell作用和主要分类等基础知识。
四、实验设备及工具
软件:PC机操作系统REDHAT ELAS4环境
五、实验原理及说明
Shell是Linux系统中一个重要的层次,它是用户与系统交互作用的界面。在介绍Linux 命令时,Shell都作为命令解释程序出现:它接收用户打入的命令,进行分析,创建子进程实现命令所规定的功能,等子进程终止工作后,发出提示符。这是Shell最常见的使用方式。
Shell 除了作为命令解释程序以外,还是一种高级程序设计语言,它有变量,关键字,有各种控制语句,如if, case, while, for 等语句,有自己的语法结构。利用Shell程序设计语言可以编写出功能很强、但代码简单的程序,特别是它把相关的Linux命令有机地组合在一起,可大大提高编程的效率,充分利用Linux系统的开放性能,设计出适合自己要求的命令。
六、实验步骤
1.语法练习
(1) Shell变量
Shell有两种变量:环境变量和临时变量。在Shell脚本中临时变量又分为两类:用户定义的变量和位置参数。
用户定义的变量
用户定义的变量是最普遍的Shell变量,变量名是以字母或下化线打头的字母、数字和下线符序列,并且大小写字母意义不同。变量名的长度不受限制。定义变量并赋值的一般形式是:变量名=字符串例如,
MYFILE=/usr/meng/ff/m1.c
a.定义并显示变量的值
在程序中使用变量的值时,要在变量名前面加上一个符号“$”。这个符号告诉Shell,要读取该变量的值。
练习1.1:
b.read命令
作为交互式输入手段,可以利用read命令由标准输入(即键盘)上读取数据,然后赋给指定的变量。其一般格式是:read 变量1 [变量2...]
隔符。注意以下情况:
*若变量个数与给定数据个数相同,则依次对应赋值,如上面例子所示。
*若变量数少于数据个数,则从左至右依次给变量赋值,而最后一个变量取得所有余下数据的值。
*若变量个数多余给定数据个数,则从左到右依次给变量赋值,后面的变量没有输入数据与之对应时,其值就为空串。
位置参数
执行Shell脚本时可以使用参数。由出现命令行上的位置确定的参数称做位置参数。在sh中总共有十个位置参数,其对应的名称依次是$0,$1,$2,...$9。其中$0始终表示命令名或Shell脚本名,对于一个命令行,必然有命令名,也就必定有$0;而其它位置参数依据实际需求,可有可无。
练习1.3 位置参数的作用。
a.在你的计算机上建立以下三个文件(设建立在目录/usr/username之下,其中username 表示你的主目录名):
文件m1.c:
如果没有包含在其中,则利用以下语句改变PATH的值:
$ PATH= $ PATH:/usr/usr/username
练习1.4 利用位置参数给定变量赋值。
(2)Shell中的特殊字符
通配符
通常的通配符有三种:
* 星号,它匹配任意字符的0次或多次出现。但注意,文件名前面的圆点(.)和路径名中的斜线(/)必须显示匹配。
?问号,它匹配任意一个字符。
[] 一对方括号,其中有一个字符组。其作用是匹配该字符组所限定的任意一个字符。
应该注意:字符* 和?在一对方括号外面是通配符,若出现在其内部,它们就失去通配符的能力了。
!叹号,若它紧跟在一对方括号的左方括号[之后,则表示不在一对方括号中所列出的字符。
引号
在Shell中引号分为三种:单引号、双引号、和倒引号。
◆双引号
由双引号括起来的字符,除$、倒引号和反斜线(\)仍保留其功能外,其余字符通常作为普通字符对待。
练习1.5
由单引号括起来的字符都作为普通字符出现。
◆倒引号
又:
转义字符,若想在字符串中使用反斜线本身,则必须采用(\\)的形式,其中第一个反斜线作为转义字符,而把第二个反斜线变为普通字符。
(3)条件判断与循环结构
if 语句
练习1.7
如上例改写成为:
有两种常用形式:一种是用test命令,如上所示。另一种是用一对方括号将测试条件括起来。两种形式完全等价。例如,测试位置参数$1是否是已存在的普通文件,可写成:test -f " $1",也完全可写成:[ -f $ l ]
在格式上应注意,如果在test语句中使用shell变量,为表示完整、避免造成歧异起见最好用双引号将变量括起来。利用一对方括号表示条件测试时,在左方括号[之后、右方括号]之前各应有空格。
练习1.8
练习1.9
b.执行ex11
练习1.10
b.执行ex12,并分析结果。 for语句
练习1.11
练习1.12
b.执行ex13,并分析运行结果。
(4)函数的定义与调用
同其他高级语言一样,shell也提供了函数功能。
其定义格式如下:
定义函数之后,可以在shell中对此函数进行调用如下所示:
2.综合实验一:清除/var/log 下的log 文件
练习2.1 cleanlog.sh版本1
在一个最简单的例子中,一个shell 脚本其实就是将一堆系统命令列在一个文件中。好处就是把所有命令都放在一个脚本中,不用每次都敲它们.这样的话,对于特定的应用来说,这个脚本就很容易被修改或定制。
在这次练习中,我们编写一个最简单的脚本,其内容是用两条命令清除/var/log/message
下面按照Shell编程的一些规则进行改良:
在第一行添加一个Bash 脚本的正确的开头部分,指定解释器为bash。
使用变量指定/var/log目录,在后面使用这个变量。
最后用exit退出。
使用注释说明各部分的用法。
练习2.3 cleanlog.sh版本3
现在,让我们来编写有真正意义的脚本:
添加权限有关语句,判断执行脚本的是否根用户,如果不是则输出出错信息,退出。
添加语句,判断是否有命令行参数,如果有,假设是n,在后面的清除log的时候保留最后的n行;如果没有,设n=50。
你可以不断地找到新的方法来完善这个脚本,并提高效率。
3.综合实验二:找出死链接文件
执行流程:
1.判断是否有命令行参数,如果没有,那么就使用当前目录,否则就使用传递进来的参数作为目录来搜索。
2.建立函数linkchk,用来检查传进来的目录或文件是否是链接和是否链接到不存在的路径,即死链接。
如果是死链,打印出它们的路径。
如果传进来的目录有子目录,那么把子目录也发送到linkchk 函数中处理,也就是递归目录。
3.对每个从脚本传递进来的参数,都调用linkchk 函数去处理,如果有参数不是目录,那就打印出错误消息和使用信息。