天天看點

《linux程式設計<Beginning linux programming>》第二章關于CD的Shell程式設計

  想不到我申請部落格園已經一年了,一年中盡然一點痕迹都沒有留下,莫名有沖動想開辟自己的園地,是以,就翻出以前的書,再溫習下,溫習過程中,也給出一些相關的測試代碼吧。

  下面是《linux程式設計》中關于2.8節CD唱片的綜合應用部分的一些代碼,使用gdialog工具,沒有參考書中給的樣例,按自己的想法寫的,自己也是一知半解,基本上實作了上面的部分功能,當然存在很多bug,貼出來,有興趣的也可以看看撒,寫的不好,就别拍了。

 ====================

1 #!/bin/bash
  2 #This script was created by ChudyShao in 2013,4,4
  3 #This is a CD collection.
  4 
  5 #### Initialize global variables
  6 
  7 title_file="title.cdb"
  8 tracks_file="tracks.cdb"
  9 tmp_file=./cdb.$$
 10 menu_choice=""
 11 trap 'rm -f $tmp_file' EXIT
 12 
 13 ###################### Function definition
 14 set_menu_choise(){ #add main menu
 15     gdialog --title "Main menu" --menu "choise one" 25 100 4 1 "Check" 2 "Search" 3 "New" 4 "Exit" 2>$tmp_file
 16     menu_choice=$(cat $tmp_file) #your choice
 17     return
 18 }
 19 select_operate(){ #choise select
 20     gdialog --title "select an operator" --menu "select" 25 100 5 1 "look" 2 "delete" 3 "search" 4 "add" 5 "back" 2>$tmp_file
 21     menu_choice=$(cat $tmp_file)
 22     case $menu_choice in
 23         1)    open_tracks $1;; #look
 24         2)    delete_content $1;; #delete
 25         3)    search_tracks $1;; #search
 26         4)    add_track $1;; #add
 27         *)    set_contents;; #back
 28     esac
 29     return
 30 }
 31 open_tracks(){ #check tracks
 32     if [ $1 -lt 10 ];then # 10 is boundary
 33         cat $tracks_file|grep CD00$1 >$tmp_file
 34     else
 35         cat $tracks_file|grep CD0$1 >$tmp_file
 36 
 37     fi
 38     gdialog --title "songs" --textbox $tmp_file 25 100
 39     #select_operate
 40     set_contents
 41     return
 42 }
 43 delete_content(){ #delete the whole content, delete the title and tracks
 44     if [ $1 -lt 10 ];then
 45         sed -i "/CD00$1/d" $tracks_file
 46         sed -i "/CD00$1/d" $title_file
 47         LineNum=$(cat $title_file|grep -c %)
 48         for((j=$1;j<=$LineNum;j++)) #此處暫未考慮9/10等特殊情況,否則要分多種情況,懶了
 49         do
 50             sed -e 's/CD00'$(expr $j + 1)'%/CD00'$j'%/' $title_file >$tmp_file
 51             cat $tmp_file>$title_file
 52             sed -e 's/CD00'$(expr $j + 1)'%/CD00'$j'%/' $tracks_file >$tmp_file
 53             cat $tmp_file>$tracks_file
 54         done
 55     else
 56         sed -i "/CD0$1/d" $tracks_file
 57         sed -i "/CD0$1/d" $title_file
 58         LineNum=$(cat $title_file|grep -c %)
 59         for((j=$1;j<=$LineNum;j++))
 60         do
 61             sed -e 's/CD0'$(expr $j + 1)'%/CD0'$j'%/' $title_file >$tmp_file
 62             cat $tmp_file>$title_file
 63             sed -e 's/CD0'$(expr $j + 1)'%/CD0'$j'%/' $tracks_file >$tmp_file
 64             cat $tmp_file>$tracks_file
 65         done
 66 
 67         
 68     fi
 69 
 70     set_contents
 71     return
 72 }
 73 
 74 search_tracks(){ #first choose a special title, then search a track
 75     gdialog --title "search track" --inputbox "name" 15 25 2>$tmp_file
 76     searname=$(cat $tmp_file)
 77     echo $searname
 78     touch cdb2.$$
 79     grep $1 $tracks_file >cdb2.$$
 80     grep $searname cdb2.$$>$tmp_file
 81     rm -f cdb2.$$
 82     gdialog --title "search track" --textbox $tmp_file 25 100 
 83     return
 84 }
 85 
 86 add_track(){ # add a new track to the title
 87     gdialog --title "add tracks" --inputbox "song name" 15 25 2>$tmp_file
 88     songName=$(cat $tmp_file)
 89     gdialog --title "add tracks" --inputbox "writer name" 15 25 2>$tmp_file
 90     writerName=$(cat $tmp_file)
 91     if [ $1 -lt 10 ];then
 92         insertStr="%CD00$1%$songName%$writerName%"
 93         sed -i '$a\'$insertStr'' $tracks_file
 94     else
 95         insertStr="%CD0$1%$songName%$writerName%"
 96         sed -i '$a\'$insertStr'' $tracks_file
 97     fi
 98     return
 99 }
100 
101 set_contents(){
102     line=""
103     LineNum=$(cat $title_file|grep -c %)
104     i=1
105     while read line
106     do
107         conName[$i]="`echo $line|awk -F '%' '{print $2}'`";
108         titleName[$i]="`echo $line|awk -F '%' '{print $3}'`"
109         typeName[$i]="`echo $line|awk -F '%' '{print $4}'`"
110         writerName[$i]="`echo $line|awk -F '%' '{print $5}'`"
111         i=$(expr $i + 1)
112     done <$title_file
113 
114     strline=""
115     for((j=1;j<$(expr $LineNum + 1);j++))
116     do
117         strline="$strline $j ${conName[j]}_${titleName[j]}_${typeName[j]}_${writerName[j]}"
118     done
119     strline="$strline $j back"
120     gdialog --title "Contents" --menu "content title type writer" 25 100 $LineNum $strline 2>$tmp_file
121     menu_choice=$(cat $tmp_file)
122     case $menu_choice in
123         $j) ;;
124         [0123456789]) select_operate $menu_choice;; #open_tracks $menu_choice;;
125     esac
126     return
127 }
128 ############# Main 
129 #Welcome
130 if [ ! -f $title_file ];then
131     gdialog --title "Welcome!" --msgbox "Welcome to Chudy's CD collection!
132     This is the first time you use it" 15 25
133     clear
134     touch $title_file
135 fi
136 if [ ! -f $tracks_file ];then
137     touch $tracks_file
138 fi
139 
140 #
141 quit=N
142 while [ "$quit" != "Y" ];
143 do
144     set_menu_choise
145     case $menu_choice in
146         1)    set_contents;;
147         2)    ;; #whole search, refer to search_tracks
148         3)    ;; #new content/tracks, refer to add_tracks
149         4)    quit=Y;;
150         *)    break;;
151     esac
152 done
153 rm -f $tmp_file
154 clear
155 echo "You quit this app"
156 exit 0      

一些東西還是能用的,之前對sed/awk等不了解,現在有一些了解了,具體可以參考其他資料,哈哈,就算開始學習了吧。

轉載于:https://www.cnblogs.com/ChudyShao/archive/2013/04/14/3019849.html