Exercises
Suppose in a directory that you wanted to change all the filenames ending in .f77 so that they instead ended in .f90. How would you go about it?
If you're new to Unix you may need to find out how to change filenames. Typing apropos filename will list the programs and routines whose summaries mention filename. Alas, the most useful command isn't mentioned there. Typing apropos rename lists mv which is what you need.
Maybe next you might try "mv *.f77 *.f90". Alas, this won't work - the shell will replace *.f77 by a list of filenames and the resulting command will fail. You need to use a loop of some sort. You also need a way to remove a suffix (look up basename) and how to add a new suffix. It's worth experimenting with a single name first. Do filename=test.f77 and see if you can produce a test.f90 string from $filename . One solution is
for filename in *.f77 do b=$(basename $filename .f77) mv $filename $b.f90 done
Here are some more exercises with useful man pages suggested. None of the solutions to these should be much more than a dozen lines long. Answers to some of these are in the next section.
- Change the args script supplied earlier so that if
no argument is provided, "They are'' isn't printed, and if exactly 1
argument is provided, "... 1 argument'' rather than "... 1 arguments''
is printed (use if)
- Read in two numbers from the keyboard and print their sum (see the
read, echo and let commands in the shell
manual page).
- Write a shell script that given a person's uid, tells you how many times that
person is logged on.
(who, grep, wc)
- Write a shell script called lsdirs which lists just
the directories in the current directory (test).
- Write a shell script called see taking a filename name as argument
which uses ls if the file's a directory and more if
the file's otherwise
(test)
- Write a shell script that asks the user to type a word in, then tells the
user how long that word is. (read, wc)
- In many versions of unix there is a -i argument for cp so that you
will be prompted for confirmation if you are about to overwrite a file.
Write a script called cpi which will prompt if necessary without
using the -i argument.
(test)
- Write a shell script that takes a uid as an argument and prints out that
person's name, home directory, shell and group number. Print out the name
of the group corresponding to the group number, and other groups that
person may belong to.
(groups, awk, cut. Also look at /etc/passwd and /etc/groups).
- Sort /etc/passwd using the uid (first field) as the key.
(sort)
- Suppose that you want to write the same letter to
many people except that you want each letter addressed to the
senders personally. This mailmerge facility can be created
using a shell script. Put the names of the recipients (one per line)
in a file called names, create a texfile called
template which has NAME wherever you want the
person's name to appear and write a script (using sed) to
produce a temporary file called letter from the template
file.