Linuxshell编程CD唱片管理系统.docx
- 文档编号:15892756
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:17
- 大小:147.45KB
Linuxshell编程CD唱片管理系统.docx
《Linuxshell编程CD唱片管理系统.docx》由会员分享,可在线阅读,更多相关《Linuxshell编程CD唱片管理系统.docx(17页珍藏版)》请在冰点文库上搜索。
Linuxshell编程CD唱片管理系统
Linux程序开发环境
实验报告
项目名称LinuxShell程序设计
专业班级软件
学号
姓名
实验成绩:
批阅教师:
批阅日期:
2016年6月1日
实验3LinuxShell程序设计
1、实验目的
(1)掌握Linuxshell程序运行方法
(2)掌握LinuxShell程序基本语法
(3)了解Linux环境变量
(4)编写简单Linuxshell程序
2、实验容
完成简单CD唱片管理系统。
(1)需求
假设你收集了大量的CD唱片,现在为了方便管理,需要设计和实现一个管理CD唱片的程序。
程序至少能够把每CD唱片的资料保存起来,如唱片的名称、音乐类型、艺术家或作曲家的名字等;然后针对某CD唱片而言,还需要保存一些简单的曲目信息;程序要可以以CD唱片为单位进行搜索,而不是以曲目为单位;为了使程序具备完整性,还需要实现对CD唱片资料的输入、修改和删除等功能。
(2)设计
把标题信息和曲目信息分开,用两个文本文件分别来存储。
每CD唱片保存如下信息:
编号、标题、曲目类型(流行、爵士等)、作曲家等。
曲目只保存下面两个信息:
编号和曲名。
如下表所示:
表1.唱片信息
唱片编号
标题
曲目类型
作曲家
CD123
Coolsax
jazz
Bix
CD234
Classicviolin
classic
Bach
CD345
Hits99
pop
Various
表2.曲目信息
目录编号
曲目编号
曲名
CD123
1
Somejazz
CD123
2
Morejazz
CD234
1
SonatainDminor
CD345
1
Dizzy
各项信息用逗号来分隔。
(3)实现
程序共包含如下函数:
get_return()
get_confirm()
set_menu_choice()
insert_title()
insert_track()
add_record_tracks()
add_records()
find_cd()
update_cd()
count_cds()
remove_records()
list_tracks()
3.实验步骤
(1)信息;
#!
/bin/bash
#VerysimpleexampleshellscriptformanagingaCDcollection.
#Copyright(C)2010-2013CentralSouthUniversity.
(2)设置实验脚本程序将要用到的全局变量,包括标题文件、曲目文件和一个临时文件,同时设置Ctrl+C组合键的中断处理,确保在用户中断脚本程序时删除临时文件;
menu_choice=”“
current_cd=”“
title_file=”title.cdb”
tracks_file=”tracks.cdb”
temp_file=/tmp/cdb.$$
trap‘rm-f$temp_file’EXIT
(3)现在开始定义函数。
最开始两个简单的工具型函数;
get_return(){
echo-e“Pressreturn\c”
readx
return0
}
get_confirm(){
echo-e“Areyousure?
\c”
whiletrue
do
readx
case“$x”in
y|yes|Y|Yes|YES)
return0;;
n|no|N|No|NO)
echo
echo“Cancelled”
return1;;
*)
echo“Pleaseenteryesorno”;;
esac
done
}
(4)接下来是主菜单函数,菜单的容是动态变化的,当用户选择了某CD唱片后,主菜单中会多出几个选项;
set_menu_choice(){
clear
echo“Options:
-“
echo
echo“a)AddnewCD”
echo“f)FindCD”
echo“c)CounttheCDsandtracksinthecatalog”
if[“$cdcatnum”!
=“”];then
echo“l)Listtrackson$cdtitle”
echo“r)Remove$cdtitle”
echo“u)Updatetrackinformationfor$cdtitle”
fi
echo“q)Quit”
echo
echo-e“Pleaseenterchoicethenpressreturn\c”
readmenu_choice
return
}
(5)然后是两个很小的函数insert_title和insert_track,这两个函数用户向数据库文件中添加数据,在此基础上是一个比较大的函数add_record_tracks,该函数会用到上述两个小函数,使用模式匹配确保用户未输入逗号(因为本实验脚本把逗号用做数据字段之间的分隔符),使用算术操作在用户输入曲目时递增当前曲目的编号;
insert_title(){
echo$*>>$title_file
return
}
insert_track(){
echo$*>>$tracks_file
return
}
add_record_tracks(){
echo“EntertrackinformationforthisCD”
echo“Whennomoretracksenterq”
cdtrack=1
cdttitle=”“
while[“$cdttitle”!
=“q”]
do
echo-e“Track$cdtrack,tracktitle?
\c”
readtmp
cdttitle=${tmp%%,*}
if[“$tmp”!
=“$cdttitle”];then
echo“Sorry,nocommasallowed”
continue
fi
if[-n“$cdttitle”];then
if[“$cdttitle”!
=“q”];then
insert_track$cdcatnum,$cdtrack,$cdttitle
fi
else
cdtrack=$((cdtrack-1))
ficdtrack=$((cdtrack+1))
done
}
(6)add_records函数用于输入新CD唱片的标题信息;
add_records(){
#Promptfortheinitialinformation
echo-e“Entercatalogname\c”
readtmp
cdcatnum=${tmp%%,*}
echo-e“Entertitle\c”
readtmp
cdtitle=${tmp%%,*}
echo-e“Entertype\c”
readtmp
cdtype=${tmp%%,*}
echo-e“Enterartist/composer\c”
readtmp
cdac=${tmp%%,*}
#Checkthattheywanttoentertheinformation
echoAbouttoaddnewentry
echo“$cdcatnum$cdtitle$cdtype$cdac”
#Ifconfirmedthenappendittothetitlesfile
ifget_confirm;then
insert_title$cdcatnum,$cdtitle,$cdtype,$cdac
add_record_tracks
else
remove_records
fi
return
}
(7)find_cd函数的作用是使用grep命令在CD唱片标题文件中查找CD唱片的有关资料。
程序需要知道查询字符串在标题文件里出现的次数,但grep命令的返回值只能获取该字符串是匹配了0次还是多次。
为了解决这一问题,我们把grep命令的输出保存到一个临时文件,文件中的每行对应一个匹配,然后再统计该文件的行数。
单词统计命令wc在其输出中使用空格符分隔被统计文件中的行数、单词数和字符个数。
我们使用$(wc–l$temp_file)标记从wc命令的输出结果中提取出第一个参数,并赋值给变量linesfound。
我们把IFS(部数据字段分隔符)设置为一个逗号,这样是为了读取以逗号分隔的数据字段。
另一个可选的命令是cut。
find_cd(){
if[“$1”=“n”];then
asklist=n
else
asklist=y
fi
cdcatnum=”“
echo-e“EnterastringtosearchforintheCDtitles\c”
readsearchstr
if[“$searchstr”=“”];then
return0
fi
grep“$searchstr”$title_file>$temp_file
set$(wc-l$temp_file)
linesfound=$l
case“$linesfound”in
0)
echo“Sorry,nothingfound”
get_return
return0
;;
1)
;;
2)
echo“Sorry,notunique.”
echo“Foundthefollowing”
cat$temp_file
get_return
return0
esac
IFS=”,”
readcdcatnumcdtitlecdtypecdac<$temp_file
IFS=”“
if[-z“$cdcatnum”];then
echo“Sorry,couldnotextractcatalogfieldfrom$temp_file”
get_return
return0
fi
echo
echoCatalognumber:
$cdcatnum
echoTitle:
$cdtitle
echoType:
$cdtype
echoArtist/Composer:
$cdac
echo
get_return
if[“$asklist”=“y”];then
echo-e“ViewtracksforthisCD?
\c”
readx
if[“$x”=“y”];then
echolist_tracks
echo
fi
fi
return1
}
(8)update_cd函数用于重新输入CD唱片的资料。
注意,我们要搜索(使用grep)的行是以$cdcatnum开头(通过标志^)并且其后跟一个逗号,因此需要把$cdcatnum变量的扩展放在一对花括号{}里,这样就可以搜索紧跟在CD目录编号之后的逗号了。
这个函数还在get_confirm返回true的情况下,用花括号将要执行的多个语句组成一个语句块。
update_cd(){
if[-z“$cdcatnum”];then
echo“YoumustselectaCDfirst”
find_cdn
fi
if[-n“$cdcatnum”];then
echo“Currenttracksare:
-“
list_tracks
echo
echo“Thiswillre-enterthetracksfor$cdtitle”
get_confirm&&{
grep-v“^${cdcatnum},”$tracks_file>$temp_file
mv$temp_file$tracks_file
echo
add_record_tracks
}
fi
return
}
(9)count_cds函数用于快速统计数据库中CD唱片个数和曲目总数;
count_cds(){
set$(wc-l$title_file)
num_titles=$l
set$(wc-l$tracks_file)
num_tracks=$l
echofound$num_titlesCDs,withatotalof$num_trackstracks
get_return
return
}
(10)remove_records函数用于从数据库文件中删除数据项,通过grep–v命令删除所有匹配的字符串。
注意:
必须使用一个临时文件来完成这一工作,如果使用类似下面的命令:
grep–v“^$cdcatnum”>$title_file
$title_file文件就会在grep命令开始执行之前,被>重定向操作设置为空文件,结果导致grep命令将从一个空文件里读取数据。
remove_records(){
if[-z“$cdcatnum”];then
echoYoumustselectaCDfirst
find_cdn
fi
if[-n“$cdcatnum”];then
echo“Youareabouttodelete$cdtitle”
get_confirm&&{
grep-v“^${cdcatnum},”$title_file>$temp_file
mv$temp_file$title_file
grep-v“^${cdcatnum},”$tracks_file>$temp_file
mv$temp_file$tracks_file
cdcatnum=”“
echoEntryremoved
}
get_return
fi
return
}
(11)list_tracks函数还是使用grep命令来找出想要的行,通过cut命令来访问想要的字段,然后通过more命令提供按页输出。
list_tracks(){
if[“$cdcatnum”=“”];then
echonoCDselectedyet
return
else
grep“^${cdcatnum},”$tracks_file>$temp_file
num_tracks=$(wc-l$temp_file)
if[“$num_tracks”=“0”];then
echonotracksfoundfor$cdtitle
else{
echo
echo“$cdtitle:
-“
echo
cut-f2--d,$temp_fileecho
}|${PAGER:
-more}
fi
fi
get_return
return
}
(12)现在所有的函数都已定义好,开始进入主程序部分:
开头的几行先确保需要的文件处于一个已知状态,然后调用主菜单函数set_menu_choice,再根据其输出进行相应的操作。
如果用户选择了退出,程序就先删除临时文件,再显示结束信息,最后成功退出(退出码为0)。
rm-f$temp_file
if[!
-f$title_file];then
touch$title_file
fi
if[!
-f$tracks_file];then
touch$tracks_file
fi
#Nowtheapplicationproper
clear
echo
echo
echo“MiniCDmanager”sleep1
quit=n
while[“$quit”!
=“y”];
do
set_menu_choice
case“$menu_choice”in
a)
add_records;;
r)
remove_records;;
f)
find_cdy;;
u)
update_cd;;
c)
count_cds;;
l)
list_tracks;;
b)
echo
more$title_file
echoget_return;;
q|Q)
quit=y;;
*)
echo“Sorry,choicenotrecognized”;;
esac
done
#Tidyupandleave
rm-f$temp_file
echo“Finished”exit0
4、实验记录
(1)实验过程:
vimCD.sh新建文件
按i:
在当前光标处插入文本
按Esc返回命令模式
:
wq保存当前修改并退出到终端
命令行输入shCD.sh运行文件,后报错。
找到报错的行数
fi需要回车另起一行
修改后保存
再次运行CD.sh,脚本正确
(2)心得体会
进入系统,su进入root用户,使用vimCD.sh命令新建shell文件,命令模式和插入模式切换。
自己敲代码,通读代码然后根据错误信息进行调试修改,会发现其中的错误都是细节性的小错误,这就需要足够细心,这也是我们平时学习和项目中的要做到的重要一点。
Vim按i:
在当前光标处插入文本。
按Esc返回命令模式。
:
wq保存当前修改;在85行出现错误,fi与if对应,后面的容要换行,退出vim,输入shCD.sh执行文件。
实验中遇到一些下列疑问并查阅得到答案
开始对$1(数字)的含义不理解,就会把它当成$l(字母),$1(数字)在shell中称为“位置参数”,表示传入的第1个参数;$#:
表示总参数的个数;$:
所有参数的字符串。
if或elif后的条件必须用[],且表达式和中括号之间一定要有空格;比较的表达式中用$取变量值之后要用双引号引起;
$title_file文件就会在grep命令开始执行之前,被>重定向操作设置为空文件,结果导致grep命令将从一个空文件里读取数据。
单词统计命令wc在其输出中使用空格符分隔被统计文件中的行数、单词数和字符个数。
我们使用$(wc–l$temp_file)标记从wc命令的输出结果中提取出第一个参数,并赋值给变量linesfound。
我们要搜索(使用grep)的行是以$cdcatnum开头(通过标志^)并且其后跟一个逗号,因此需要把$cdcatnum变量的扩展放在一对花括号{}里,这样就可以搜索紧跟在CD目录编号之后的逗号了。
要了解各个shell命令的含义,比如read,if等等的格式,Linuxshell特别注重格式。
空格,单双引号的使用,特别容易产生错误,所以要细心,也要明确的知道每个格式的空格和引号的数量,用哪个,怎么用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linuxshell 编程 CD 唱片 管理 系统
![提示](https://static.bingdoc.com/images/bang_tan.gif)