您的位置:首页 > 运维架构 > Linux

linux CD管理程序

2015-06-13 17:43 369 查看
参考范例写的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: