Right now if I have a file that has the following information (with : as the delimiter)
name :address :phone number
I need to be able to do the following commands:
-n search for a name
-p search for a phone number
-l search for a last name starting with a particular
-c find an area code
-a add a new record to the file
-r replace an entry with new data
An example of running the script would be :
perl ./phonebook -l A (-l is first arguement and A is second arguement)
perl ./phonebook -a Jones, Edward
I currently have:
#if there are no arguements (IE -r, -l, ect) than output the file
if [ $# -eq 0 ]
then
cat < dirInfo
#if the first arguement is -n, output any line that contains the 2nd argument (this WORKS, and if the name is the 2nd argument it will output the whole line of information)
elif [ "$1" = "-n" ]
then
grep $2 dirInfo
#I keep getting a "syntax error near unexpected token `('" error. I figured I could use the grep for the phone number just like the name?
#I have also tried something like grep '[0-9]\{3\}-[0-9]\{4\}' but dont know how to compare with 2nd arguement.
elif [ "$1" == "-p" ]
then
grep $2 dirInfo
#I cant grep a variable? This seems to be one of the main things stopping me, I dont know how to incorporate the variable (their input) into grep.
elif [ "$1" == "-l" ]
then
grep '^$2' dirInfo
#As for finding an area code, I would assume thats very similar to finding the whole number, with a small edit of the code.
elif [ "$1" == "-c" ]
then
#Appending a name that they enter (arguement 2). This does not work at all.
elif [ "$1" == "-a" ]
then
sed '$a\$2'
#=: command not found
elif [ "$1" == "-r" ]
then
echo "Enter the new name: "
read name
echo "Enter the new address: "
read address
echo "Enter the new phone number: "
read phonenumber
$line = grep $2 dirInfo
sed 's/$line/name, address, phonenumber/p' dirInfo
else
echo "not found."
fi
I know there are tons of problems I have been googling and reading "Unix The Ultimate Guide by Sumitabha Das" but am still in need of a lot of help. Any input is appreciated, thanks!
You need to quote your arguments (and check how you spell "argument", wink wink) -- that should solve several of your problems.
grep "$2" dirInfo
Single quotes will prevent the expansion of $2 into its value; you are then grepping literally for (end of line) 2 which will never match. (Remember $ means end of line in regular expressions.) So don't use single quotes around a variable.
Things get tricky when you want to use both single quotes and double quotes, but you can even mix them in the same string. So to grep for $2 at end of line you could do something like
grep "$2"'$' file
That's $2 in double quotes, and $ in single quotes, without any space or anything in between. (Next week, we will look at double quotes in single quotes and single quotes in double quotes in the same string.)
What's with the perl? This is a shell script, you'd run it with sh, not perl (although I guess perl is always Doing What You Mean and will actually run sh for you if it sees that you are giving it a shell script; but that sounds rather fragile for you to rely on).
Thank you so much for your reply. Sorry about the spelling!
To check the last name (input is the first letter) this worked!:
grep '^'"$2" dirInfo
One of my biggest questions is why the grep wont work for a string such as (123)456-7899. I get the syntax error near unexpected token `(' error.
-r
-c
-p
these are my only current problems. Two of them are with the area code/phone number so if I can figure out one than the other should be somewhat simple. I will continue to work on it but if anyone has any suggestions I would greatly appreciate them, thanks.
elif [ "$1" == "-r" ]
then
echo "Enter the new name: "
read name
echo "Enter the new address: "
read address
echo "Enter the new phone number: "
read phonenumber
#ERROR line = 'grep $2 dirInfo'
sed -e 's/$line/$name $address $phonenumber/g' dirInfo
else
echo "not found."
Still having problems. Can I not assign grep output to a variable?
You can't have spaces around the equals sign. But you might as well inline this into the sed script.
sed "s/.*$2.*/$name $address $phonenumber/" dirInfo
If you want to replace an existing entry in dirInfo, you need to save the result somewhere; this will merely print it. If your sed has the -i option, that's something you could explore.
However, this loses the information about whether the match was successful or not, so you might need to refactor it so that an error message can be printed if not. Maybe your grep idea was better after all.
You might want to anchor the search string a little better; if somebody says they want to replace "a" in the phone book, this will replace all lines containing the letter a anywhere in them.
Again, don't use single quotes if you want variables to be expanded; use double quotes.
This will still delete all lines which contain the argument string anywhere in them; perhaps you would be better off if you required the argument to match the entire first field, exactly.
It seems like I have tried every possible thing. when I do exactly what you suggested it just acts like a cat (when the user is inputing information, it keeps going until i press ctrl+d). If I can just figure out how to delete the line containing the pattern of $2 (first and last name) than id be fine.
Thanks for any/all help.
could it have anything to do with the quotations that get entered as input?
elif [ "$1" == "-r" ]
then
echo "Enter the new name: "
read name
echo "Enter the new address: "
read address
echo "Enter the new phone number: "
read phonenumber
#Delete is not working
sed "/^$2:/d"
#Outputs new name and information, then sorts the whole list
sed '$a\'"$name :$address :$phonenumber" dirInfo | sort
else
echo "not found."
fi
To run the program: ./phonebook -r "Anderson, Thomas"
echo $1 outputs -r
echo $2 outputs Anderson, Thomas