linux CD管理程序


参考范例写的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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值