Linux下的Shell程序设计Linux下的Shell程序设计 (1)一.引言 (2)1.1.编写目的: (2)1.2定义: (2)3.参考资料: (3)二.任务的描述 (3)2.1.目标: (3)2.2功能描述: (3)2.3.运行环境: (3)2.4.条件与限制: (3)三.任务设计 (4)3.1.整体设计: (4)3.2.详细设计: (5)3.2.1.Menu模块: (5)3.2.2. Add模块 (6)3.2.3 Delete模块 (9)四.实现过程 (10)4.1.问题1 (10)4.2.问题2 (11)五.程序运行 (11)5.1.程序运行的过程: (11)5.1.1.执行效果截图 (11)5.1.2.输入错误截图 (12)5.1.3.选择菜单1,运行截图 (12)5.1.4.选择菜单2,运行截图 (12)5.1.5选择菜单3,运行截图 (12)5.1.6 选择菜单5,运行截图 (12)5.1.7 选择菜单6,运行截图 (13)5.1.8 选择菜单7,运行截图 (13)六、感想认识 (13)七.程序代码 (14)7.1.Menu模块 (14)7.2.Add模块 (15)7.3.Delete模块 (20)一.引言1.1.编写目的:通过本课程设计,使学生巩固Linux和嵌入式系统的的基本概念、原理和技术,学会在Linux 系统下完成Shell程序设计。
1.2定义:1)grepLinux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
2)sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
3)rmrm 名称源自英文单词remove的缩写,用于删除文件系统中的文件、目录、设备文件、符号链接等对象。
准确地说,rm移除的指向特定对象的引用。
在文件系统中,这些特定的对象可能有多个引用(例如,两个不同的文件名可能指向相同的文件), 只有在一个对象不再有任何引用,并且没有任何程序还拥有这个文件的有效句柄的时候,这个文件才会被删除。
4)cat显示或者把多个文本文件连接起来。
cat是concatenate的简写,类似于dos下面的type 命令。
5)moremore命令,功能类似cat。
more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按b键就会往回(back)一页显示,而且还有搜寻字串的功能。
more命令从前向后读取文件,因此在启动时就加载整个文件。
6)awkawk是一个数字处理工具。
相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个“字段”来处理。
运行效率高,而且代码简单,对格式化的文本处理能力超强。
awk 是”Aho Weiberger and Kernighan”三个姓的第一个字母缩写。
7)sedsed是一种在线编辑器,它一次处理一行内容。
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
接着处理下一行,这样不断重复,直到文件末尾。
文件内容并没有改变,除非你使用重定向存储输出。
Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
3.参考资料:(1) 陈祥琳《Linux Shell脚本编程从入门到精通》ISBN: 9787302347927清华大学出版社,2014(2.)孙琼《嵌入式Linux C语言应用程序设计》ISBN: 9787115342799 人民邮电出版社2014(3)秦攀科《Linux C程序设计——实例详解与上机实验》ISBN:9787512106680北京交通大学出版社2011二.任务的描述2.1.目标:(1)按要求设计Shell程序,实现用户管理的菜单,(2)用Shell编程,实现menu主菜单,要求菜单中包含用户的显示,添加,删除等功能。
2.2功能描述:在主Shell脚本文件里要有一个多操作选项的菜单(即主菜单)以便用户从中选择。
在不同任务的中,这些操作能自动实现以下功能:在屏幕上显示当前所有用户的记录在屏幕上显示当前所有用户(经过格式化和排序的)的记录只在屏幕上显示用户名和用户ID只在屏幕上显示(经过格式化和排序的)用户名和用户ID查询并显示特定用户的记录往passwd文件里增加新的用户记录从passwd文件里删除某个用户记录2.3.运行环境:硬件:装有Windows操作系统的计算机软件:Vmware和Linux下的C语言开发环境2.4.条件与限制:三.任务设计3.1.整体设计:在目录下有三个文件分别为menu,add,delete其中: menu文件中的程序完成1,2,3,4,5功能;另外写一个add脚本文件和delete脚本文件分别实现选项6和7。
另外还有一个系统自带的passwd文件存放用户记录。
当用户做了选择且所选的操作完成之后,可以再次显示主菜单以供用户做下一步选择。
用while循环和case条件语句配合来完成此操作。
程序主要有三个最重要的部分,1是主界面2是添加用户3是删除用户。
下面是它们的流程图。
主菜单:Add模块:Delete模块:3.2.详细设计:3.2.1.Menu模块:(menu文件中的程序完成1,2,3,4,5功能)#! /bin/sh-record_file=/etc/passwd #三个文件变量add_file=adddelete_file=detelewhile truedoclearecho " 用户信息主菜单"echo "=============================================="echo "1、打印当前所有记录"echo "2、打印当前所有记录(格式化后的) "echo "3、打印用户名和用户ID "echo "4、打印(格式化了的)用户名和用户ID "echo "5、查询特定记录"echo "6、增加新记录"echo "7、删除记录"echo "Q--退出"echo -n "你的选择是:"read choicecase $choice in #通过case进入相应的入口1)cat $record_file | tr ":" " " ;; #显示passwd中的内容,同时将每行的:替换成空格#awk -F ":" ' ($3==0 || $3 > 499 && $3 < 6000) {printf "%-10s %-3s %-10s %-10s %-10s %-10s %-10s/n", $1,$2,$3,$4,$5,$6,$7}' $record_file#指定格式输出用户cat $record_file | tr ":" "\t" | sort -d -k1;;#对cat出来的数据加上水平制表符,然后按照第一列排序默认升序输出3)cat $record_file | tr ":" "," | cut -f 1,3 -d,;;#对于cat出来的结果,将:替换成,然后截取第1.3列,之间用,分割4)cat $record_file | cut -f 1,3 -d:| tr ":" "\t";;#对于cat出来的结果,借取1.3,之间用:然后将:替换成水平制表符5)echo -n "输入关键字:" #查询特定记录,按照用户名read namewhile test -z $name #测试字符串的长度为零doecho "没有输入关键字"echo -n "输入关键字:"read namedoneif( cut -f 1 -d: $record_file | grep -iq ^$name ) #iq忽略大小写和不显示thengrep -iw ^$name $record_file #查找以name开头的记录^是匹配正则表达式的开始elseecho "没有找到$name"fi;;6)sh $add_file;;7)sh $delete_file;;Q)break 10;;q)break 10;;*)echo -n "无效的代码"esacecho -n "按回车键继续。
"read answerdone3.2.2. Add模块(完成用户的添加,以下是主要代码,部分省略)"添加用户名,主要注意用户是字母加数字且要以字母开头。
while truedoecho -n "用户名:"if test -z $namethenecho "没有输入用户名"continuefiif test $name = "N" -o $name = "n"thensh menuexitfiif (`echo $name |grep -q '^[A-Za-z0-9]*$'` && `echo $name | grep -q '^[A-Za-z]'` )#^[A-Za-z0-9]*$正则表达式匹配大小写字母以及数字,排除用户名中的特殊字符^[A-Za-z]用户名只能以字母开头thenif (grep -wq ^$name $record_file )thenecho "该用户名已存在,请重新输入!"elsebreakfielseecho "用户名只包含字母和数字,并且要以字母开头"continuefidone添加密码,添加密码用的是read -s 输入密码时密码不显示出来。
while truedoecho -n "密码:"read -s pwd1echoif test -z $pwd1thenecho "密码不能为空!请重新输入!"continuefiif test $pwd1 = "N" -o $pwd1 = "n"then# sh menuexitfiif test `expr length $pwd1` -ge 6thenecho -n "确认密码:"read -s pwd2echoif test $pwd1 = $pwd2thenbreakelseecho "密码不一致!请重新输入!"fielseecho "密码长度至少要6位!请重新输入!"fidone添加用户ID,主要注意用户ID要为数字且数字范围在500-60000 while truedoecho -n "用户ID:"read idif test -z $idthenecho "没有键入ID"continuefiif test $id = "N" -o $id = "n"then# sh menuexitfiif (`echo $id | grep -q '^[0-9]*$'` && test $id -ge 500 -a $id -le 60000) thenif (cut -f 3 -d : $record_file| grep -w $id)thenecho "ID已存在,请键入别的ID"continueelsebreakfielseecho "ID必须大于等于500小于等于60000"continuefidone下面主要就是添加用户了echo 主目录:$name#mkdir /home/$nameuseradd $name -p $pwd1 -u $id -s /bin/$sheecho $pwd1|passwd --stdin $nameif [ $? -eq 0 ] #上一条指令执行是否有问题thenecho $name "创建成功!";fi# echo "$name:$pwd1:$id:$gid:$fullname:/home/$name:/bin/$she" >>passwd;echo "$name $pwd1 $id $gid $fullname /home/$name /bin/$she"echo -n "再增加一个吗?(Y/N)"read choiceif test $choice = "Y" -o $choice = "y"thencontinueexitelseif test $choice = "N" -o $choice = "n"thensh menuexitfifiDone3.2.3 Delete模块(以下也是删除模块的关键代码,部分有删除)删除模块刚开始的查找用的是用户ID。