实验二.docx
- 文档编号:23598158
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:26
- 大小:26.50KB
实验二.docx
《实验二.docx》由会员分享,可在线阅读,更多相关《实验二.docx(26页珍藏版)》请在冰豆网上搜索。
实验二
实验二Shell编程试验
1.目的要求
(1)熟悉Shell环境和常用功能;
(2)掌握Shell基本语法结构,并能编写简单的Shell程序。
(3)独立完成Shell课程设计——CDManager
2.实验内容
(1)命令补齐功能
●用date命令查看系统当前时间,在输入da后,按tab键,让shell自动补齐命令的后半部分。
date
●用mkdir命令创建新的目录。
首先输入第一个字母m,然后按tab键,由于以m开头的命令太多,shell会提示是否显示全部的可能命令,输入n。
●再多输入一个字母k,按tab键,让shell列出以mk开头的所有命令的列表。
●在列表中查找mkdir命令,看看还需要多输入几个字母才能确定mkdir这个命令,然后输入需要的字母,再按tab键,让shell补齐剩下的命令。
●最后输入要创建的目录名,按回车键执行命令。
●多试几个命令利用tab键补齐。
(2)命令别名功能
●输入alias命令,显示目前已经设置好的命令的别名。
●设置别名ls为ls–l,以长格形式显示文件列表:
#aliasls=‘ls-l’。
●显示别名ls代表的命令,确认设置生效:
#aliasls。
●使用别名ls显示当前目录中的文件列表。
●在使定义的别名不失效的情况下,使用系统的ls命令显示当前目录中的命令列表:
#\ls。
●删除别名ls:
#unaliasls。
●显示别名ls,确认删除别名已经生效:
#aliasls。
●最后再用命令ls显示当前目录中的文件列表。
●写出定义别名cd为cd/etc的命令
Aliascd='cd/etc'
(3)输出重定向
●用ls命令显示当前目录中的文件列表:
#ls–l。
●使用输出重定向,把ls命令在终端上显示的当前目录中的文件列表重定向到文件list中:
#ls–l>list。
●查看文件list中的内容,注意在列表中会多出一个文件list,其长度为0。
这说明shell是首先创建了一个空文件,然后再运行ls命令:
#catlist。
●再次使用输出重定向,把ls命令在终端上显示的当前目录中的文件列表重定向到文件list中。
这次使用管道符号>>进行重定向:
#ls–l>>list。
●查看文件list的内容,可以看到用>>进行重定向是把新的输出内容附加在文件的末尾,注意其中两行list文件的信息中文件大小的区别:
catlist。
●重复命令#ls–l>list。
●再次查看文件list中的内容,和前两次的结果相比较,注意list文件大小和创建时间的区别,完成课后第一题。
>>追加
>覆盖
(4)输入重定向
●使用输入重定向,把上面生成的文件list用mail命令发送给自己:
#mailroot ●查看新邮件,看看收到的新邮件中其内容是否为list文件中的内容。 (5)管道 ●利用管道和grep命令,在上面建立的文件list中查找字符串list: #catlist|greplist。 ●利用管道和wc命令,计算文件list中的行数、单词数和字符数: #catlist|wc。 ●查看和修改Shell变量 ●用echo命令查看环境变量PATH的值: #echo$PATH。 ●设置环境变量PATH的值,把当前目录加入到命令搜索路径中去: #PATH=“$PATH: .”。 ●用echo命令查看环境变量PATH的值: #echo$PATH。 ●比较前后两次的变化。 (6)简单的shell程序 ●习题1: 使用Vi将程序menu.sh程序补充完善。 #! /bin/bash echo"PleasechooseeitherN,E,DorQ: " cat<<-ENDIT #[N]ewafile #[E]ditafile #[D]eleteafile #[Q]uit ENDIT readchoice case"$choice"in N)echo"pleaseinputanewfilename: " readvalue Touch${value} ;; E)echo"pleasinputafilename: " readvalue Vi${value} ;; D)echo"Pleaseinputafilename: " readvalue rm-r${value} ;; Q)TERM=quit echo"QuitSuccessfully" ;; Esac 思考: 执行程序,写出程序的执行结果。 菜单显示: _ N是创建文件即touch文件 E是编辑文件即VI文件 D是删除文件即是rm命令删除 Q是放弃 ●习题2: 变量替换(在横线上为语句添加相应的解释) #! /bin/bash解释这个脚本的shell,这里用的是bash #ThisisthefirstBashshellprogramoftheday. #Scriptname: greetings #Writtenby: BarbaraBashful echo"Hello$LOGNAME,it'snicetalkingtoyou." 输出用户名字root echo"Yourpresentworkingdirectoryis`pwd`." `pwd`是命令替换输出当前路径 echo"Youareworkingonamachinecalled`uname-n`." uname-n标识当前系统再UUCP通信网络的名称 n显示网络上的主机名字 S显示主机的操作系统 M显示主机的架构类型 ls#Listfilesinthepresentworkingdirectory 显示当前目录文件 echo"Byefornow$LOGNAME.Thetimeis`date+%T`! " 输出时间 思考: 执行程序,写出程序的执行结果。 习题3: 位置变量的设定及使用(在横线上为语句添加相应的解释) #! /bin/bash #Scriptname: args #Scripttotestcommand-linearguments echoThenameofthisscriptis$0.$0: 表示脚本名字 echoTheargumentsare$*.$*所有参数 echoThefirstargumentis$1.$1第一个参数 echoThesecondargumentis$2.$2第二个参数 echoThenumberofargumentsis$#.$#参数个数 oldargs=$*将参数列表赋值给oldargs变量 setJakeNickyScott重新设置变量 echoAllthepositionalparametersare$*.输出新设置的所有参数 echoThenumberofpositionalparametersis$#.输出新的参数个数 echo"Good–byefornow,$1."输出第一个参数 set$(date)将date时间设置为变量 echoThedateis$2$3,$6.输出date的第2,3,6个参数 echo"Thevalueof\$oldargsis$oldargs."变量oldargs原来的参数列表 set$oldargs将oldargs变量重新设置成参数列表 echo$1$2$3重新输出 思考: 执行程序,写出程序的执行结果。 ●习题4: 深入理解let命令的用法。 比如我们可以用+=、(())等方式来实现运算符,并在横线上写明运算结果 (1)$i=5 $leti=5i=5 (2)$leti=i+1 $echo$i6 (3)$let"i=i+2" $echo$i7 (4)$let"i+=1" $echo$i6 (5)$i=3 $((i+=4)) $echo$i7 $((i=i-2)) $echo$i1 ●习题5: 命令替换,通过位置变量的方式来实现一个平方的操作—do_square.sh,请在横线上解释相应运行结果 #! /bin/bash #Scriptname: do_square functionsquare{ localsq#sqislocaltothefunction let"sq=$1*$1" echo"Numbertobesquaredis$1." echo"Theresultis$sq" }函数功能: 求参数$1的平方 echo"Givemeanumbertosquare." readnumber value_returned=$(square$number)。 //注意返回的是输出两句echo echo"$value_returned" 函数功能: Givemeanumbertosquare. 2 Numbertobesquaredis2 Theresultis4 ●习题5: 阅读下列脚本expr.sh,写出其完成的功能是: #! /bin/sh NO=100 START=1 SUM=0 echo-n"Calculate"$START"to"$NO"..."//-ndonotoutputthetrailingnewline// while[$NO-gt0] do SUM=`expr$START+$SUM`expr数值运算 START=`expr$START+1` NO=`expr$NO-1`前后分别相加的算法 done echo"OK,Theansweris$SUM" exit0 Calculate1to100....OKTheansweris5050 计算0-100的sum ●习题7: 阅读下列脚本read.sh,写出其运行结果 #! /bin/bash #Scriptname: nosy echo-e"Areyouhappy? \c" readanswer echo"$answeristherightresponse." echo-e"Whatisyourfullname? \c" readfirstmiddlelast echo"Hello$first" echo–n"Wheredoyouwork? " read echoIguess$REPLYkeepsyoubusy! //注意REPLY ------------------------------------------------------- read-p"Enteryourjobtitle: " echo"Ithoughtyoumightbean$REPLY." echo-n"Whoareyourbestfriends? " read-afriends echo"Sayhito${friends[2]}." (7)Shell综合应用——CDManager ●功能描述: 设计并编写一个管理CD唱盘的程序。 1)“CD唱盘管理程序”能够把各张CD唱盘的基本资料保存起来,比如唱盘名称、音乐类型、歌曲家或作曲家的名字等。 同时,还需要保存每张唱盘中所包含的曲目资料。 2)“CD唱盘管理程序”能够对所有唱盘信息进行检索(下属的曲目细节暂不作考虑),并且还能对唱盘资料进行输入、修改和删除操作。 ●数据描述 1)唱片文件: title.cdb CDNum Title Type Artist CD123 CoolSax Jazz Bix CD234 Classicviolin Classical Bach CD345 Hir99 Pop Various 2)曲目文件: tracks.cdb CDNum TrackNum TrackTitle CD123 1 Somejazz CD123 2 Morejazz CD345 1 Dizzy CD234 1 SonatainDminor 3)函数介绍 ✧get_return()#等待输入,相当于Pressanykeytocontinue ✧get_confirm()#确认输入 ✧set_menu_choice()#主菜单 ✧insert_title()#插入CD唱盘“标题”信息 ✧insert_track()#插入CD唱盘“曲目”信息 ✧add_record_tracks()#增加“曲目”信息 ✧add_records()#增加“标题”和“曲目”信息 ✧find_cd()#查找CD唱盘信息 ✧update_cd()#更新CD唱盘信息 ✧count_cds()#快速统计CD唱盘和曲目数量 ✧remove_records()#删除CD唱代码完善: 请将CDManager程序补充完整,并调试运行。 4)CDManager程序清单 (1)#! /bin/bash (2)#VerysimpleexampleshellscriptformanagingaCDcollection (3)####################################################### (4)#全局变量 (5)####################################################### (6)menu_choice=""#当前选择的输入 (7)title_file="title.cdb"#存放cd信息 (8)tracks_file="tracks.cdb"#存放track信息 (9)temp_file=/tmp/cdb.$$ (10)trap'rm-f$temp_file'EXIT (11)##################################################### (12)#函数定义 (13)#################################################### (14)#等待输入 (15)get_return(){ (16)echo-e"Pressreturn\c" (17)readx (18)return0 (19)} (20)#等待确认 (21)get_confirm(){ (22)echo-e"Areyousure? \c" (23)whiletrue (24)do (25)readx (26)case"$x"in (27)y|yes|Y|Yes|YES) (28)return0;; (29)n|no|N|No|NO) (30)echo (31)echo"Cancelled" (32)return1;; (33)*) (34)echo"Pleaseenteryesorno";; (35)esac (36)done (37)} (38)#菜单信息 (39)set_menu_choice(){ (40)clear (41)echo"Options: -" (42)echo (43)echo"a)AddnewCD" (44)echo"f)FindCD" (45)echo"c)CounttheCDsandtracksinthecatalog" (46)if[-n$cd_number];then (47)echo"l)Listtracks" (48)echo"r)Remove" (49)echo"u)Updatetrackinformation" (50)fi (51)echo"q)Quit" (52)echo (53)echo-e"Pleaseenterchoicethenpressreturn\c" (54)readmenu_choice (55)return (56)} (57)#插入CD (58)insert_title(){ (59)#利用输入重定向、系统参数在title.cdb中插入记录 (60)echo$*>>$title_file (61)return (62)} (63)#插入每一张CD的内部信息 (64)insert_track(){ (65)#利用输入重定向、系统参数在tracks.cdb中插入$cdcatnum,$cdtrack,$cdttitle组成的记录 (66)echo$*>>$tracks_file (67)return (68)} (69)#增加CD内部信息 (70)add_record_tracks() (71){ (72)echo-e"\n! ! ! 输入CD专辑信息当结束时候输入---n! ! ! "#输入CD信息 (73)echo (74)track_number=1;#必须有CD的情况下才可以输入CD信息从1开始 (75)track_name="" (76)while["$track_name"! ="n"] (77)do (78)echo"你现在的CD为CD$track_number.请输入CD曲目名子! " (79)readtemp (80)track_name=${temp%%,*} (81)if[-n"track_name"]&&["$track_name"! ="n"]#CD名子不为空且不为结束符号n (82)then (83)insert_track${cd_number}${track_number}${track_name}#向文件中插入CD信息 (84)else (85)track_number=$((track_number-1))#无效CD目减去1设置成0 (86)fi (87)track_number=$((track_number+1))#成功CD目录加1 (88)done (89)return0#成功 (90)} (91)#增加CD信息 (92)add_records(){ (93)clear (94)echo-e"\t\t***************************************" (95)echo-e"\t\t\t增加CD请输入CD号\n\t\t注意: (输入内容不要无效字符,按enter确认)" (96)echo (97)echo"****请输入CD的号码****" (98)readtemp (99)cd_number=${temp%%,*}#删除最大匹配'的返回剩下的 (100)echo"****轻输入CD标题****" (101)readtemp (102)cd_name=${temp%%,*} (103)echo"****请输入CD歌曲类型****" (104)readtemp (105)cd_type=${temp%%,*} (106)echo"****请输入CD作者****" (107)readtemp (108)cd_author=${temp%%,*}#输入CD岛号专辑名子风格作者 (109)get_confirm#等待用户确认 (110)if[$? =0]#用户确认正确 (111)then (112)insert_title${cd_number}${cd_name}${cd_type}${cd_author} (113)add_record_tracks#增加CD内部信息一个CDnumber对应相应的信息 (114)fi (115)return0 (116)} (117)#//查找CD信息 (118)find_cd(){ (119)#0-正确1-错误3-返回没有CD信息 (120)clear (121)echo-e"\t\t******************查找CD信息***************************" (122)echo-e"\n****输入你要查找CD号****" (123)readtemp (124)cd_temp=${temp%%,*} (125)if[-z"$cd_temp"]#输入不能为空 (126)then (127)echo-e"\n\n\t\t! ! ! 对不起,请确认你是否输入号码! ! ! " (128)sleep3 (129)return1 (130)fi (131) (132)grep"$cd_temp"$title_file>$temp_file (133)readcd_numbercd_namecd_typecd_author<$temp_file (134)if[-z"$cd_number"]#没有要查找的CD (135)then (136)echo-e"\n\n\t\t! ! ! 对不起,没有你要查找的CD号! ! ! " (137)sleep3 (138)return0 (139)fi (140)clear (141)echo"************************查找的CD信息************************************" (142)echo"CD号: $cd_numberCD名子: $cd
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验