Linux下shell程序设计.docx
- 文档编号:12774442
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:30
- 大小:155.21KB
Linux下shell程序设计.docx
《Linux下shell程序设计.docx》由会员分享,可在线阅读,更多相关《Linux下shell程序设计.docx(30页珍藏版)》请在冰点文库上搜索。
Linux下shell程序设计
Linux下的Shell程序设计
一.引言
1.1.编写目的:
通过本课程设计,使学生巩固Linux和嵌入式系统的的基本概念、原理和技术,学会在Linux系统下完成Shell程序设计。
1.2定义:
1)grep
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
grep全称是GlobalRegularExpressionPrint,表示全局正则表达式版本,它的使用权限是所有用户。
2)sort
将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
3)rm
rm名称源自英文单词remove的缩写,用于删除文件系统中的文件、目录、设备文件、符号链接等对象。
准确地说,rm移除的指向特定对象的引用。
在文件系统中,这些特定的对象可能有多个引用(例如,两个不同的文件名可能指向相同的文件),只有在一个对象不再有任何引用,并且没有任何程序还拥有这个文件的有效句柄的时候,这个文件才会被删除。
4)cat
显示或者把多个文本文件连接起来。
cat是concatenate的简写,类似于dos下面的type命令。
5)more
more命令,功能类似cat。
more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按b键就会往回(back)一页显示,而且还有搜寻字串的功能。
more命令从前向后读取文件,因此在启动时就加载整个文件。
6)awk
awk是一个数字处理工具。
相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个“字段”来处理。
运行效率高,而且代码简单,对格式化的文本处理能力超强。
awk是”AhoWeibergerandKernighan”三个姓的第一个字母缩写。
7)sed
sed是一种在线编辑器,它一次处理一行内容。
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
接着处理下一行,这样不断重复,直到文件末尾。
文件内容并没有改变,除非你使用重定向存储输出。
Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
3.参考资料:
(1)陈祥琳《LinuxShell脚本编程从入门到精通》ISBN:
9787302347927清华大学出版社,2014
(2.)孙琼《嵌入式LinuxC语言应用程序设计》ISBN:
9787115342799人民邮电出版社2014
(3)秦攀科《LinuxC程序设计——实例详解与上机实验》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=add
delete_file=detele
whiletrue
do
clear
echo"用户信息主菜单"
echo"=============================================="
echo"1、打印当前所有记录"
echo"2、打印当前所有记录(格式化后的)"
echo"3、打印用户名和用户ID"
echo"4、打印(格式化了的)用户名和用户ID"
echo"5、查询特定记录"
echo"6、增加新记录"
echo"7、删除记录"
echo"Q--退出"
echo-n"你的选择是:
"
readchoice
case$choicein#通过case进入相应的入口
1)cat$record_file|tr":
""";;#显示passwd中的内容,同时将每行的:
替换成空格
2)
#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-f1,3-d,;;
#对于cat出来的结果,将:
替换成,然后截取第1.3列,之间用,分割
4)cat$record_file|cut-f1,3-d:
|tr":
""\t";;
#对于cat出来的结果,借取1.3,之间用:
然后将:
替换成水平制表符
5)echo-n"输入关键字:
"#查询特定记录,按照用户名
readname
whiletest-z$name#测试字符串的长度为零
do
echo"没有输入关键字"
echo-n"输入关键字:
"
readname
done
if(cut-f1-d:
$record_file|grep-iq^$name)#iq忽略大小写和不显示
then
grep-iw^$name$record_file#查找以name开头的记录^是匹配正则表达式的开始
else
echo"没有找到$name"
fi;;
6)sh$add_file;;
7)sh$delete_file;;
Q)break10;;
q)break10;;
*)echo-n"无效的代码"
esac
echo-n"按回车键继续。
。
"
readanswer
done
3.2.2.Add模块
(完成用户的添加,以下是主要代码,部分省略)
"
添加用户名,主要注意用户是字母加数字且要以字母开头。
whiletrue
do
echo-n"用户名:
"
readname
iftest-z$name
then
echo"没有输入用户名"
continue
fi
iftest$name="N"-o$name="n"
then
shmenu
exit
fi
if(`echo$name|grep-q'^[A-Za-z0-9]*$'`&&`echo$name|grep-q'^[A-Za-z]'`)
#^[A-Za-z0-9]*$正则表达式匹配大小写字母以及数字,排除用户名中的特殊字符^[A-Za-z]用户名只能以字母开头
then
if(grep-wq^$name$record_file)
then
echo"该用户名已存在,请重新输入!
"
else
break
fi
else
echo"用户名只包含字母和数字,并且要以字母开头"
continue
fi
done
添加密码,添加密码用的是read-s输入密码时密码不显示出来。
whiletrue
do
echo-n"密码:
"
read-spwd1
echo
iftest-z$pwd1
then
echo"密码不能为空!
请重新输入!
"
continue
fi
iftest$pwd1="N"-o$pwd1="n"
then
#shmenu
exit
fi
iftest`exprlength$pwd1`-ge6
then
echo-n"确认密码:
"
read-spwd2
echo
iftest$pwd1=$pwd2
then
break
else
echo"密码不一致!
请重新输入!
"
fi
else
echo"密码长度至少要6位!
请重新输入!
"
fi
done
添加用户ID,主要注意用户ID要为数字且数字范围在500-60000
whiletrue
do
echo-n"用户ID:
"
readid
iftest-z$id
then
echo"没有键入ID"
continue
fi
iftest$id="N"-o$id="n"
then
#shmenu
exit
fi
if(`echo$id|grep-q'^[0-9]*$'`&&test$id-ge500-a$id-le60000)
then
if(cut-f3-d:
$record_file|grep-w$id)
then
echo"ID已存在,请键入别的ID"
continue
else
break
fi
else
echo"ID必须大于等于500小于等于60000"
continue
fi
done
下面主要就是添加用户了
echo主目录:
$name
#mkdir/home/$name
useradd$name-p$pwd1-u$id-s/bin/$she
echo$pwd1|passwd--stdin$name
if[$?
-eq0]#上一条指令执行是否有问题
then
echo$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)"
readchoice
iftest$choice="Y"-o$choice="y"
then
continue
exit
else
iftest$choice="N"-o$choice="n"
then
shmenu
exit
fi
fi
Done
3.2.3Delete模块
(以下也是删除模块的关键代码,部分有删除)删除模块刚开始的查找用的是用户ID。
whiletrue
do
echo-n"输入用户ID:
"
readuid
iftest-z$uid
then
echo"没有输入!
"
continue
fi
iftest$uid="N"-o$uid="n"
then
shmenu
exit
fi
iftest$uid-ge500-a$uid-le60000
then
name=`awk-F:
'$3=="'$uid'"'$record_file|cut-d:
-f1`#声明一个变量name,将符合的第一列复制给name
if(!
test-z$name)
then
awk-F:
'$3=="'$uid'"'$record_file
echo-n"确认删除?
Y或N:
"
readan
if(test$an="Y"-o$an="y")
then
INFO=$(grep$uid$record_file)
#rmdir/home/$name
if[!
-z"$INFO"];then
userdel-r$name#这句话是删除
fi
echo"记录删除"
echo-n"再删除一个?
Y或N:
"(下面代码省略了)
四.实现过程
4.1.问题1
(1)问题描述:
删除模块中看着很正常,确认删除输入y后,显示已经确认删除,但是是假象,在主界面输入1显示用户依然存在。
(2)解决办法:
原来的代码是
修改之后的是
之前少了一部分。
4.2.问题2
(1)问题描述:
主界面以为是用的汉字,显示的时候老是出现乱码
(2)解决办法:
这个有好几个方法,1.把汉字全有英文或拼音代替2.在运行界面上点击终端->字符编码->Unicode.
五.程序运行
5.1.程序运行的过程:
5.1.1.执行效果截图
5.1.2.输入错误截图
5.1.3.选择菜单1,运行截图
5.1.4.选择菜单2,运行截图
5.1.5选择菜单3,运行截图
5.1.6选择菜单5,运行截图
5.1.7选择菜单6,运行截图
5.1.8选择菜单7,运行截图
六、感想认识
课设开始时,我看了一下课程设计任务说明书,然后选择了第二个题目,第二个题目以前做做过一部分,然后我又XX了一下希望能在XX上找到代码和步骤,果然网上还是有的。
开始课设之后我按照网上找来的做了一遍,但是没有成功,它有好几个错误,其中一个就是我上面提到的第一个问题,研究了好久,时间本来就短,心里很焦急。
询问了几个同学,他们都跟我做的不是同一个题目,最后找到会做的只能等到他做完才能教我。
事实上我也从做第二个题目的过程中学到了一些关于Linux的基础知识,老师给了Linux下shell命令的一些基本操作,然后又按照步骤一步一步来,学会了一些Linux操作系统中的基本命令,熟悉了ubuntu操作系统的文件系统以及其使用细节。
最后一周,基本上是做完了,又代码更改了一些,虽然代码是从网上下载的,但是通过对其的修改,还是让我懂得了一些shell编程知识,
通过此次课设,我学会了一些Shell主要命令的使用方法,熟悉了Linux操作系统的操作环境,了解了Shell编程的基本特点,等等。
感觉这几周学到的东西比以前几个月都多。
基本完成课设任务,达到了课设目的。
七.程序代码
7.1.Menu模块
#!
/bin/sh-
record_file=/etc/passwd#三个文件变量
add_file=add
delete_file=detele
whiletrue
do
clear
echo"用户信息主菜单"
echo"=============================================="
echo"1、打印当前所有记录"
echo"2、打印当前所有记录(格式化后的)"
echo"3、打印用户名和用户ID"
echo"4、打印(格式化了的)用户名和用户ID"
echo"5、查询特定记录"
echo"6、增加新记录"
echo"7、删除记录"
echo"Q--退出"
echo-n"你的选择是:
"
readchoice
case$choicein#通过case进入相应的入口
1)cat$record_file|tr":
""";;#显示passwd中的内容,同时将每行的:
替换成空格
2)
#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
#指定格式输出root和uid在499和6000之间的用户
cat$record_file|tr":
""\t"|sort-d-k1;;
#对cat出来的数据加上水平制表符,然后按照第一列排序默认升序输出
3)cat$record_file|tr":
"","|cut-f1,3-d,;;
#对于cat出来的结果,将:
替换成,然后截取第1.3列,之间用,分割
4)cat$record_file|cut-f1,3-d:
|tr":
""\t";;
#对于cat出来的结果,借取1.3,之间用:
然后将:
替换成水平制表符
5)echo-n"输入关键字:
"#查询特定记录,按照用户名
readname
whiletest-z$name#测试字符串的长度为零
do
echo"没有输入关键字"
echo-n"输入关键字:
"
readname
done
if(cut-f1-d:
$record_file|grep-iq^$name)#iq忽略大小写和不显示
then
grep-iw^$name$record_file#查找以name开头的记录^是匹配正则表达式的开始
else
echo"没有找到$name"
fi;;
6)sh$add_file;;
7)sh$delete_file;;
Q)break10;;
q)break10;;
*)echo-n"无效的代码"
esac
echo-n"按回车键继续。
。
"
readanswer
done
7.2.Add模块
#!
/bin/sh-
record_file=/etc/passwd
whiletrue
do
clear
echo"用户信息主菜单"
echo"=============================================="
echo"输入新用户的具体情况"
echo""
#======================用户名=========================#
whiletrue
do
echo-n"用户名:
"
readname
iftest-z$name
then
echo"没有输入用户名"
continue
fi
iftest$name="N"-o$name="n"
then
shmenu
exit
fi
if(`echo$name|grep-q'^[A-Za-z0-9]*$'`&&`echo$name|grep-q'^[A-Za-z]'`)
#^[A-Za-z0-9]*$正则表达式匹配大小写字母以及数字,排除用户名中的特殊字符^[A-Za-z]用户名只能以字母开头
then
if(grep-wq^$name$record_file)
then
echo"该用户名已存在,请重新输入!
"
else
break
fi
else
echo"用户名只包含字母和数字,并且要以字母开头"
continue
fi
done
#====================密码==============================#
whiletrue
do
echo-n"密码:
"
read-spwd1
echo
iftest-z$pwd1
then
echo"密码不能为空!
请重新输入!
"
continue
fi
iftest$pwd1="N"-o$pwd1="n"
then
#shmenu
exit
fi
iftest`exprlength$pwd1`-ge6
then
echo-n"确认密码:
"
read-spwd2
echo
iftest$pwd1=$pwd2
then
break
else
echo"密码不一致!
请重新输入!
"
fi
else
echo"密码长度至少要6位!
请重新输入!
"
fi
done
#=====================用户ID===========================#
whiletrue
do
echo-n"用户ID:
"
readid
iftest-z$id
then
echo"没有键入ID"
continue
fi
iftest$id="N"-o$id="n"
then
#shmenu
exit
fi
if(`echo$id|grep-q'^[0-9]*$'`&&test$id-ge500-a$id-le60000)
then
if(cut-f3-d:
$record_file|grep-w$id)
then
echo"ID已存在,请键入别的ID"
continue
else
break
fi
else
echo"ID必须大于等于500小于等于60000"
continue
fi
done
#=======================组ID==================================#
whiletrue
do
echo-n"组ID:
"
readgid
iftest-z$gid
then
echo"没有键入组ID"
fi
iftest$gid="N
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux shell 程序设计