《linux shell大作业》由会员分享,可在线阅读,更多相关《linux shell大作业(18页珍藏版)》请在金锄头文库上搜索。
1、1Shell 大 作 业 说 明 书题 目 LINUX Shell 编程 学生姓名 学 号 系 别 年 级 专 业 指导教师 完成日期 2010 年 6 月 25 日 1一、需求分析1.任务目标Linux作为多用户、多任务的操作系统,其系统资源是所有用户共享的。对用户的管理是操作系统的重点。LINUX 课程设计要用 shell 编程实现,将理论学习付诸实践。设计一个脚本(shell)程序能实现增加、删除、查找和显示特定用户信息的功能。2.系统要求程序要包括四个文件,即 menu,add,delete,passwd 四个文件。passwd 文件是用来保存用户信息;menu 文件是主菜单,要求运行
2、的时候能显示一个菜单供用户选择;add 文件是用来增加信息;delete 文件是用来删除信息。在主 Shell 脚本文件里(必须以 menu 命名)要有一个多操作选项的菜单以便用户从中选择。对于任务 6 和 7,需要编写单独的Shell 脚本文件(必须分别命名为 add 和 delete)并且在主脚本 menu 文件中调用这些脚本文件。在主目录下建立一个以 07wl-0x-xx(x 为班、座号)命名的目录,并且在作业中使用它作为工作目录。3.系统功能在主 Shell 脚本文件里(即 menu 文件)要有一个多操作选项的菜单以便用户从中选择。在不同任务的中,这些操作能自动实现以下功能:1、 在屏
3、幕上显示当前所有用户的记录2、 在屏幕上显示当前所有用户(经过格式化和排序的)的记录3、 只在屏幕上显示用户名和用户 ID4、 只在屏幕上显示(经过格式化和排序的)用户名和用户 ID5、 查询并显示特定用户的记录6、 往 passwd 文件里增加新的用户记录7、 从 passwd 文件里删除某个用户记录其中: menu文件中的程序完成 1,2,3,4,5功能;另外写一个 add脚本文件和 delete脚本文件分别实现选项 6和 7.当用户做了选择且所选的操作完成之后,可以再次显示主菜单以供用户做下一步选择。用 while 循环和 case 条件语句配合来完成此操作。二、总体设计1.功能图2显示
4、当前所有用户的记录 显示当前所有用户经格式化后的记录 显示用户名和用户ID显示格式化后用户名和用户ID查找指定用户信息 添加用户信息 删除用户信息用户信息主菜单2.流程图2.2.1主菜单主菜单你的选择功能实现回车退出32.2.2 add模块2.2.3 delete模块主菜单是否继续删除进入 delete 界面输入 ID 是否存在是否删除进入主菜单NYNYY4三、详细设计1.MENU主菜单主菜单在 menu脚本文件里将创建如下菜单,菜单里包含供用户选择的一些操作。无效输入当用户做了选择且所选的操作完成之后,应再次显示主菜单以供用户做下一步选择。在以上等待用户做出选择的菜单中,如果用户偶尔输入了一
5、个代码而不是1、2、3、4、5、6、7 或 Q,就有信息提示“无效的代码,请按回车键继续” 。等用户按了回车键之后,再次显示主菜单供用户做其他选择。如图: 无输入在以上等待用户做出选择的菜单中,如果用户简单地按了回车键,就会出现信息“无效的代码。等用户按了回车键之后,再次显示主菜单供用户做其他选择。5当用户选择了 1时打印当前所有用户记录当用户选择 2时打印当前经过格式化的用户记录后当用户选择 3时,打印用户名和用户 ID当用户选择 4时,打印(格式化的)用户名和用户 ID当用户选择 5时,查找特定的记录如果输入的关键字不在记录里如果用户简单地按回车键而不是输入关键字62ADD 文件当用户在主
6、菜单里选择 6时你的 add脚本文件就要被调用输入用户名用户输入一个无效的用户名用户只按回车没有输入输入密码输入密码时不显示要求密码长度至少达到 6 位以上确认密码如果与密码不符应该让用户重新输入7用户 ID如果用户只是简单的按回车键如果用户输入的是一个无效的 ID 或者是不符合格式的 ID组 ID对组 ID 的要求类似与用户 ID,一个有效的组 ID(数字、一般非超级用户的 ID 大等于500)登录 shell一个有效的 shell 必须只能是 bash、sh、kash、csh 中的一种如果用户只按回车没有输入的话则显示信息:“没有输入!” ,并提示用户再次输入 shell名保存记录83DE
7、LETE 文件当用户在主菜单中选择 7时,你的 delete脚本文件必须被调用用户输入一个无效的用户 ID用户简单的按回车键而没有任何输入继续删除四、附录(程序代码):1、menu 主脚本文件代码#! /bin/sh -#声明全局变量dataSource=passwd;homePath=.;AddUsers=. Add.sh;DeleteUsers=. Delete.sh;CheckDataSourceFileExist()if -f $dataSource then#文件存在9return 0;else#文件不存在clear;echo -n 警告 【$dataSource】 不存在!请确认!
8、;read ;return 1;fichoice=F;while $choice != Q -a $choice != q doCheckDataSourceFileExist;if $? -ne 1 thenclear;echo 用户信息管理主菜单;echo =;echo 1.显示当前所有记录;echo 2.格式化显示当前所有记录;echo 3.显示用户名和用户 ID;echo 4.格式化显示用户名和 ID;echo 5.查询特定用户信息;echo 6.添加新用户;echo 7.删除用户;echo Q.退出;echo -n 你的选择:;read choice;#作用是清除由于 read到 s
9、tring.Empty的时候引发的 bash参数过多的错误。if -z $choice thenchoice=empty;ficlear;if $choice = empty ;thenecho 选项尚未选择!;else10case $choice in1) CheckDataSourceFileExist;if $? -ne 1 thenecho 当前的所有的用户信息如下所示:;echo 用户名 密码 ID GID 说明 工作目录 登录 Shellcat $dataSource | tr : | more;fi;2) CheckDataSourceFileExist;if $? -ne 1
10、thenecho 当前的所有的用户信息如下所示:;echo -e 用户名t 密码tIDtGIDt 说明t 工作目录t 登录 Shellsort -k 1 $dataSource | awk -F : print $1 t $2 t $3 t $4 t $5 t $6 t $7 t | more;fi;3) CheckDataSourceFileExist;if $? -ne 1 thenecho 当前的所有的用户的用户名和用户 ID如下所示:;echo -e 用户名,ID;awk -F : print $1 , $3 $dataSource | more;fi;4) CheckDataSour
11、ceFileExist;if $? -ne 1 thenecho 当前的所有的用户的用户名和用户 ID如下所示:;echo -e 用户名 t ID;awk -F : print $1 t $3 $dataSource | more;fi;5) CheckDataSourceFileExist;if $? -ne 1 thenkeyWords=;while -z $keyWords doecho -n 输入搜索关键词:;read keyWords;if -z $keyWords then11echo 搜索关键词不能为空,请重新输入!;fidoneCheckDataSourceFileExist;
12、if $? -ne 1 thengrep -i $keyWords $dataSource;if $? -eq 1 thenecho 很遗憾, 【$dataSource】文件中,并不存在与 $keyWords 一致的信息。;fififi;6) $AddUsers;7) $DeleteUsers;Q) printf 程序已经退出。;q) printf 程序已经退出。;*) echo $choice :此选项不是默认提供的功能。请确认。;esacfiecho -n 确认?;read ;fidone2、add 脚本文件代码clear;isContinue=y;userName=;while $isC
13、ontinue = y -o $isContinue = Y do#用户名处理,输入一致到字符串长度不为 0为止userName=;while -z $userName do12echo -n 用户名:;read userName;if -z $userName thenecho 错误!用户名是不能为空的,请重新输入!;continue;fiif expr match $userName a-zA-Z0-9a-zA-Z* -ne expr length $userName thenecho 错误!用户名的只能由非数字打头的字符和数字组成,请重新输入!;userName=;continue;fi
14、done#密码处理:1.验空,3.密码长度要 6位,由大小写字母、数字和控制字符组成,2.验两次输入的一致性,passWord=;passWordAgain=;while -z $passWord doecho -n 密码:;read passWord;if -z $passWord thenecho 错误!密码是不能为空的,请重新输入!;continue;fiif expr length $passWord -ne 6 thenecho 密码长度为 6位,请重新输入!;passWord=;continue;fiif expr match $passWord 0-9a-zA-Z* -ne expr length $passWord thenecho 密码由大小写字母、数字和控制字符组成,请重新输入!;13passWord=;continue;fiecho -n 请在输入一次密码:;read passWordAgain;if $passWordAgain != $passWord thenecho 两次输入的密码不一样,请重新输入!;passWord=;continue;fidone#用户 UID输入处理,UID 为数字、一般非超级用户的 ID大等于 500uID=;while -z $uID doecho -n 用户 UID:;read uID;if -z $uID th