参考范例写的CD管理程序
可能还会有点小bug,不过总之通过这个实验对shell编程算是了解了不少。
说回这个项目,实际在写的过程中,看了下每个方法的实现的代码,就打算由上到下的顺序去实现,前面的都还好。中间碰到了一些看不懂的代码,网上搜了下,感觉有些地方可以用别的写法替换下,发现也是可以的。在实现歌曲的更新以及record删除的时候,发现灵活的运用了所学的命令,用grep-v 反向选择,写入文件,再将文件用mv搬移回来覆盖原有的,实现删除。范例里面代码写的巧妙。
列下觉得需要注意的几行内容:
grep "^${cdnumber}," $tracks_file > $temp_file 抓取开头为cdnumber的行放到临时文件
count _number $(wc -l $title_file) 获取行数,赋值给变量
cut -f 2- -d , $temp_file 从临时文件读出信息,以逗号分割,取第二列往后的
IFS 默认分隔符,从文件取信息的时候需要改变成逗号
注释尽量写清楚了,为的是以后不写注释了~
#declare menu_choice
current_cd=""
title_file="title02.cdb"
tracks_file="tracks02.cdb"
temp_file=/tmp/cdbxx.$$
#定义一些变量,要看懂
#菜单
set_menu_choice()
{
clear
echo "Options :-"
echo ""
echo " a) Add new CD"
echo " f) Find CD"
echo " c) Count the CDs and tracks in the catalog"
if [ "$cdnumber" != "" ]; then
echo " l) List tracks on $cdtitle"
echo " r) Remove $cdtitle"
echo " u) Update track information for $cdtitle"
fi
echo " q) Quit"
echo
echo -e "Please enter choice then press return \c"
read menu_choice
return
}
#确认函数
get_confirm(){
echo -e "Are you sure? \c"
while true
do
read x
case "$x" in
y | yes | Y | Yes | YES )
return 0;;
n | no | N | No | NO )
echo "Cancelled"
return 1;;
*) echo "Please enter yes or no";;
esac
done
}
#添加歌曲
add_records(){
read -p "enter CD number: " cdnumber
echo $cdnumber
#cdnumber = cdnumber
read -p "enter CD title: " cdtitle
read -p "enter CD type: " cdtype
read -p "enter CD composer: " cdcomposer
# 调用确认函数
echo "about to add new entry"
echo "$cdnumber $cdtitle $cdtype $cdcomposer"
#if 后面如果是函数,注意语法
if get_confirm ;then
#写入专辑文件,带参数进去
insert_title $cdnumber,$cdtitle,$cdtype,$cdcomposer
echo "successfully insert"
sleep 2
#准备往专辑里添加歌曲
add_record_tracks
else echo "***"
fi
return
}
#添加歌曲
add_record_tracks(){
clear
echo "ready to add track into the record"
echo "when mo more tracks enter q"
#必要的一些变量
declare -i cdtrack
cdtrack =1
cdtitletemp=""
while [ "$cdtitletemp" != "q" ]
do
echo "cdtrack : $cdtrack"
#添加歌曲信息
read -p "please enter song name: " cdtitletemp
#要确保名字里面没有逗号
# cdtitletemp=${cdtitletemp%%,*}
#这里需要判断是否是q,是否为空
if [ -n "$cdtitletemp" ] ; then
if [ "$cdtitletemp" != "q" ] ; then
insert_track $cdnumber,$cdtrack,$cdtitletemp
fi
#如果不符合条件,则需要给上一回循环的位置减一,但好像没有卵用
# else #cdtrack=$((cdtrack-1))
fi
cdtrack=$((cdtrack+1))
done
}
# insert_title 函数,写入专辑
insert_title(){
#往文件里面写如title
echo $*>>$title_file
return
}
#insert_track 函数,写歌曲的
insert_track(){
echo $*>>$tracks_file
return
}
#用来暂停的。。
get_return(){
echo -e "Press return \c"
read x
return 0
}
#查找cd 要读文件,用 grep cut 命令选
find_cd(){
read -p "please enter the record you want to search: " cdrecords
if [ "$cdrecords" = "" ] ; then
return 0;
fi
#查找并写入文件
grep "$cdrecords" $title_file > $temp_file
#设置结果
linefound=$(wc -l $temp_file)
#通过传参导入
# linefound = ""
#linefound = $1
#再写case语句判断取到多少
case "$linefound" in
0)
echo "sorry, no records found" ;;
1) echo "found one result";;
2) echo "found not unique .."
echo "found the following : "
cat $temp_file
get_return
return 0
;;
esac
#改变默认的分隔符?????
IFS=","
#标准输入
read cdnumber cdtitle cdtype cdcomposer < $temp_file
IFS=" "
if [ -z "$cdnumber" ] ;then
echo "could not extract from $temp_file"
get_return
return 0
fi
echo
echo "cd number:$cdnumber"
echo "cd title:$cdtitle"
echo "cd type:$cdtype"
echo "cd composer:$cdcomposer"
echo
get_return
#询问是否查看当前record下的歌曲
echo -e "View tracks from the CD? \c"
read x
if [ "$x" = "y" ]
then
echo
list_tracks
echo
fi
return 1
}
#打印record下的歌曲信息
list_tracks(){
if [ "$cdnumber" = "" ]
then
echo "no CD selected yet"
return
else
grep "^${cdnumber}," $tracks_file > $temp_file
num_tracks=$(wc -l $temp_file)
if [ "$num_tracks" = "0" ]
then
echo "no tracks found for $cdnumber"
else {
echo
echo "$cdtitle :-"
echo
cut -f 2- -d , $temp_file
echo
} | ${PAGER:-more}
fi
fi
get_return
return
}
#先把计数的给搞定
count_cds(){
#用到wc命令
#记住语法 wc -l 记录行数 后面跟查询的文件
set $(wc -l $title_file)
num_titles=$1
set $(wc -l $tracks_file)
num_tracks=$1
echo "found $num_titles CDs, with a total of $num_tracks tracks"
get_return
return
}
#删除 record
remove_records(){
if [ -z "$cdnumber" ]
then
echo "You must select a CD first"
find_cd n
fi
if [ -n "$cdnumber" ]
then
echo "You are about to delete $cdtitle"
get_confirm&&{
grep -v "^${cdnumber}," $title_file > $temp_file
mv $temp_file $title_file
grep -v "^${cdnumber}," $tracks_file > $temp_file
mv $temp_file $tracks_file
cdnumber=""
echo "Entry removed"
}
fi
return
}
#相当于将record下歌曲全删除
update_cd(){
if [ -z "$cdnumber" ]
then
echo "You must select a CD first"
find_cd n
fi
if [ -n "$cdnumber" ]
then
echo "Current tracks are :-"
list_tracks
echo
echo "This will re-enter the tracks for $cdtitle"
#如果确认则执行一下部分
get_confirm&&{
# grep -v 取反,将其他的移至temp, 然后在用mv 转过来
grep -v "^${cdnumber}," $tracks_file > $temp_file
mv $temp_file $tracks_file
echo "ready to add again"
#重新加一遍
add_record_tracks
}
fi
return
}
#相当于主函数
while [ "$quit" != "y" ];
do
set_menu_choice
case "$menu_choice" in
a)
add_records;;
r)
remove_records;;
f)
find_cd y;;
u)
update_cd;;
c)
count_cds;;
l)
list_tracks;;
b)
echo
more $title_file
echo get_return;;
q)
quit=y;;
*)
echo "Sorry, choice not recognized";;
esac
done
#Tidy up and leave
rm -f $temp_file
echo "Finished" exit 0