| Previous | Table of Contents | Next |
Listing 22.4 Complete Listing of the delperson Script
1 #!/bin/sh
2 # Name: delperson
3 # Desc: del a person addressbook
4 # Args: $1 -> name of person to delete
5
6 # get the helper functions
7
8 . $HOME/lib/sh/libTYSP.sh
9
10 PATH=/bin:/usr/bin
11
12 # check that a name is given
13
14 if [ $# -lt 1 ] ; then
15 printUSAGE "'basename $0' name"
16 exit 1
17 fi
18
19 # check that the address book exists
20
21 MYADDRESSBOOK="$HOME/addressbook"
22 if [ ! -f "$MYADDRESSBOOK" ] ; then
23 printERROR "$MYADDESSBOOK does not exists, or is
⇒not a file."
24 exit 1
25 fi
26
27 # initialize the variables holding the location of the
28 # temporary files
29 TMPF1=/tmp/apupdate.$$
30 TMPF2=/tmp/abdelets.$$
31
32 # function to clean up temporary files
33
34 doCleanUp() { rm "$TMPF1" "$TMPF1.new" "$TMPF2" 2>
⇒/dev/null ; }
35
36 # function to exit if update failed
37 Failed() {
38 if [ "$1" -ne 0 ] ; then
39 shift
40 printERROR $@
41 doCleanUp
42 exit 1
43 fi
44 }
45
46 # make a copy of the address book for updating,
47 # proceed only if sucessful
48
49 cp "$MYADDRESSBOOK" "$TMPF1" 2> /dev/null
50 Failed $? "Could not make a backup of the address book."
51
52 # get a list of all matching lines from the address book copy
53 # continue if one or more matches were found
54
55 grep "$1" "$TMPF1" > "$TMPF2" 2> /dev/null
56 Failed $? "No matches found."
57
58 # prompt the user for each entry that was found
59
60 exec 5< "$TMPF2"
61 while read LINE <&5
62 do
63
64 # display each line formatted
65
66 echo "$LINE" | awk -F: '{
67 printf "%-10s %s\n%-10s %s\n%-10s %s\n%-10s %s\n\n",\
68 "Name:",$1,"Email:",$2,"Address:",$3,
⇒"Phone:",$4 ;
69 }'
70
71 # prompt for each line, if yes try to remove the line
72
73 promptYESNO "Delete this entry" "n"
74 if [ "$YESNO" = "y" ] ; then
75
76 # try to remove the line, store the updated version
77 # in a new file
78
79 grep -v "$LINE" "$TMPF1" > "$TMPF1.new" 2> /dev/null
80 Failed $? "Unable to update the address book"
81
82 # replace the old version with the updated version
83
84 mv "$TMPF1.new" "$TMPF1" 2> /dev/null
85 Failed $? "Unable to update the address book"
86
87 fi
88 done
89 exec 5<&-
90
91 # save the original version
92
93 mv "$MYADDRESSBOOK" "$MYADDRESSBOOK".bak 2> /dev/null
94 Failed $? "Unable to update the address book"
95
96 # replace the original with the edited version
97
98 mv "$TMPF1" "$MYADDRESSBOOK" 2> /dev/null
99 Failed $? "Unable to update the address book"
100
101 # clean up
102
103 doCleanUp
104
105 exit $?
In the first part of the script (lines 830), you perform some initialization. Specifically, you perform the following actions:
After initialization, you create a few additional helper functions:
The first main step in the script is to make a copy of the address book (line 49). If this step fails, you exit (line 50). If this step is successful, you make a list of all the lines in the address book that match the name specified by the user (line 55). If you cannot successfully make this file, you exit (line 56).
Next you enter the delete loop (lines 6089). For each line that matches the name provided by the user you print a formatted version of the line (lines 6669). Notice that you are using the same awk statement from the showperson script.
For each matching line, you ask the user whether the entry should be deleted (line 73). If the user agrees (line 74), you do the following:
If either of these operations fail, you exit (lines 80 and 85).
After the deletes are finished, you make a backup of the original address book (line 93). Then you replace the address book with the fully edited version (line 98). Again you exit if either operation fails (lines 94 and 99).
Finally you clean up and exit.
Here is an example of this script in action:
$ ./delperson Sriranga Name: Sriranga Veeraraghavan Email: ranga@soda.berkeley.edu Address: 1136 Wunderlich Dr. San Jose CA Phone: 408-444-4444 Delete this entry (y/n)? [n] y
Here I replied yes to the question. You can confirm that the delete worked as follows:
$ ./showperson Sriranga $
Because there is no output from showperson, this entry has been deleted.
| Previous | Table of Contents | Next |