这篇文章是《Linux程序设计 第四版》中的第二章的最后练习题(2.8综合应用),
题目是编写一个CD数据库应用程序,
首先:用两个文件来保存存储的数据,一个是title_file.cdb,一个是column_file.cdb!
title_file.cdb里面保存的是唱片的基本信息:拥有如下四个字段:
CD的目录编号,标题,唱片类型,作曲家或艺术家;
column_file.cdb里面保存的是唱片的详细信息即唱片包含的歌曲信息:拥有如下三个字段:
CD的目录编号,曲目编号,歌曲名
其次:
有如下函数模块:
get_return() 返回函数
get_confirm() 是否继续操作函数
add_records() 增加CD基本信息函数
insert_title() 在title_file.cdb插入CD基本信息函数
add_records_cds() 增加CD详细信息函数
insert_track() 在column_file.cdb插入CD基本信息函数
find_records() 查找CD信息函数
rm_records() 删除CD信息函数
update_records() 更新CD详细信息函数
count_records() 统计CD数量以及歌曲数量信息函数
list_records() 列出选中CD的详细信息(歌曲)函数
memu_display() 菜单界面函数
代码中主要用到的命令:
grep; 过滤每一个行字符串
cut; 根据字段切割整列字符串
wc; 统计行数等数目
set;
read; 键盘输入
echo; 输出
>、>>、<; 输入输出重定向
rm
以及各种逻辑判断,字符串操作,管道命令使用等~
题目是编写一个CD数据库应用程序,
首先:用两个文件来保存存储的数据,一个是title_file.cdb,一个是column_file.cdb!
title_file.cdb里面保存的是唱片的基本信息:拥有如下四个字段:
CD的目录编号,标题,唱片类型,作曲家或艺术家;
column_file.cdb里面保存的是唱片的详细信息即唱片包含的歌曲信息:拥有如下三个字段:
CD的目录编号,曲目编号,歌曲名
其次:
有如下函数模块:
get_return() 返回函数
get_confirm() 是否继续操作函数
add_records() 增加CD基本信息函数
insert_title() 在title_file.cdb插入CD基本信息函数
add_records_cds() 增加CD详细信息函数
insert_track() 在column_file.cdb插入CD基本信息函数
find_records() 查找CD信息函数
rm_records() 删除CD信息函数
update_records() 更新CD详细信息函数
count_records() 统计CD数量以及歌曲数量信息函数
list_records() 列出选中CD的详细信息(歌曲)函数
memu_display() 菜单界面函数
代码中主要用到的命令:
grep; 过滤每一个行字符串
cut; 根据字段切割整列字符串
wc; 统计行数等数目
set;
read; 键盘输入
echo; 输出
>、>>、<; 输入输出重定向
rm
以及各种逻辑判断,字符串操作,管道命令使用等~
题目不难,主要是熟悉各种命令~
代码如下:
#!/bin/bash
temp_file="./tempfile.cdb"
title_file="./title_file.cdb"
column_file="./column_file.cdb"
choose=""
#return
get_return()
{
echo -e "Press return \c "
read x
return 0
}
#confirm
get_confirm()
{
echo "Are u sure?(y/n)"
while true;
do
read yn
case "$yn" in
y | Y )
return 0;;
n | N )
return 1;;
* ) echo "Please enter y or n";;
esac
done
}
add_records()
{
echo "Please input the record's name like this"
echo "CD123,Cool sax,Jazz,Bix"
read input
local temp=$(echo $input|egrep '^[[:alnum:]]+,[[:alpha:]]+,[[:alpha:]]+,[[:alpha:]]+$')
if [ "$temp" == "" ];then
echo "wrong name"
sleep 1
return 0;
else
cdnum=$(echo $input|cut -d ',' -f1)
cdtitle=$(echo $input|cut -d ',' -f2)
cdtype=$(echo $input|cut -d ',' -f3)
cdac=$(echo $input|cut -d ',' -f4)
fi
echo "the name is $cdnum $cdtitle $cdtype $cdac"
if get_confirm ;then
insert_title $cdnum $cdtitle $cdtype $cdac
add_records_cds
return
else
echo "you dont save the record"
return
fi
}
add_records_cds()
{
echo "Please input the record's list name like this:"
echo "Juhuatai,Qianlizhiwai,..."
read names
local k=$(echo "$names"|awk -F ',' '{print NF}')
#echo $k
declare -i j=1;
y=$((k));
#echo $y
while [ $j -le $y ];
do
insert_track $cdnum $j $(echo "$names"|cut -d ',' -f $j)
j=$j+1
done
}
find_records()
{
if [[ "$1" == "n" ]]; then
asklist="n";
else
asklist="y";
#statements
fi
echo "input a string to search for in the cd titles"
read searchstr
if [ "$searchstr" == "" ];then
return 0;
fi
grep -i "$searchstr" $title_file > $temp_file;
#将计算出来的数目的第一个参数(行的数量)赋给linesfound
set $(wc -l $temp_file)
linesfound=$1
case "$linesfound" in
0) echo "No found"
get_return
return 0;;
1) ;;
2) echo "Sorry,many results:"
cat $temp_file
get_return
return 0;;
esac
read cdnum cdtitle cdtype cdac < $temp_file
if [ -z "$cdnum" ]; then
echo "Sorry,can't extract details from $temp_file"
get_return
return 0
#statements
fi
echo
echo "CD number: $cdnum"
echo "Title: $cdtitle"
echo "Type: $cdtype"
echo "Artist: $cdac"
echo
get_return
if [[ "$asklist" == "y" ]]; then
echo "View tracks for this CD?"
read x
if [[ "$x" == "y" ]]; then
echo
list_records;
echo
#statements
fi
#statements
fi
return 1
}
rm_records()
{
find_records n;
if [[ -n "$cdnum" ]]; then
echo "Deleting CD: $cdnum $cdtitle $cdtype $cdac"
get_confirm &&{ grep -v "^$cdnum" $title_file > $temp_file
mv $temp_file $title_file
grep -v "^$cdnum" $column_file > $temp_file
mv $temp_file $column_file
cdnum=""
echo "Delete ready"
}
get_return
#statements
fi
return
}
update_records()
{
if [ "$cdnum" == "" ];then
echo "you dont choose a CD"
return ;
fi
echo "updateing the CD's songs $cdtitle"
get_confirm &&{
grep -v "^$cdnum" $column_file > $temp_file
mv $temp_file $column_file
echo
add_records_cds
}
return
}
count_records()
{
local num_cds=$(wc -l $title_file|cut -d " " -f1)
local num_songs=$(wc -l $column_file|cut -d " " -f1)
echo "the nums for the CD is : $num_cds"
echo "the nums for the Songs is : $num_songs"
}
list_records()
{
[ "$cdnum" == "" ]&&echo "no CD selected"&&return
grep "^$cdnum" $column_file > $temp_file
local num_songs=$(wc -l $temp_file)
if [[ "$num_songs" == "0" ]]; then
echo "no songs found for $cdtitle"
else
echo
echo "$cdtitle:-"
echo
cut -d " " -f 2- $temp_file
echo
#statements
fi
get_return
return
}
memu_display()
{
echo "Options: "
echo
echo " a) Add CD "
echo " f) Find CD"
echo " r )Remove CD"
echo " c )Count CDs"
if [ "$cdnum" != "" ];then
echo " l )List tracks for $cdtitle"
echo " u )Update track for $cdtitle"
fi
echo " q) Quit"
echo
read -p "Please choose which action: " choose
return
}
insert_title()
{
echo $* >> $title_file
return
}
insert_track()
{
echo $* >> $column_file
return
}
#main
rm -rf $temp_file
[ ! -f $title_file ] && touch $title_file ;
[ ! -f $column_file ] && touch $column_file ;
sleep 1
while true
do
memu_display
case "$choose" in
a )add_records;;
r )rm_records;;
f )find_records y;;
u )update_records;;
c )count_records;;
l )list_records;;
b )
echo
more $title_file
echo
get_return
;;
q|Q )
break;;
* )
echo "sorry,choice no right";;
esac
done
rm -rf $temp_file
echo "Finish~"
exit 0