Interactive shell scripts are useful, but to be scriptable a command needs to be able to use command line arguments to accomplish tasks in a non-interactive manner. A truly versatile script will be able to work either way.
While there are many ways to handle command line arguments,
*nix systems generally
use command line options and arguments (also called parameters)
the same way.
This has led to the inclusion of getopts
as a standard
utility to make this tasks simpler, known as parsing
the command line arguments.
(A version of getopts
is also available for C
,
Perl, and other languages.)
The Gnu project provides a similar tool, getopt
with
many additional features compared to standard getopts
.
For this project you will create a shell script to manage a “to do” list. This is a list of tasks you need to accomplish soon. Using your script users must be able to: view the list of tasks, add an item to the list, and remove an item from the list. Additionally you should provide a “help” option to provide instructions on how to use your script.
When displaying the list of to-do tasks, the output should number them. Those numbers will be used to remove an item by its number.
The list should be kept in a private file in the user's
home directory named “$HOME/.todo
”.
The file format should be simple: one item per line.
(Note you don't store any line numbers in the file itself,
just the to-do item as entered by the user.)
For extra credit provide a menu driven user interface too. When invoked with no command line arguments, your script should provide this interactive mode.
You can make up your own set of options, but I suggest these for the required three tasks:
-l
” to display the items in the
list.
Each item should be numbered. -a STRING
” to add
STRING
as a new item to the end of the
list.
(STRING
must be quoted if it contains
spaces!) -r NUM
” to remove task number
NUM
from the list.
You must use either getopts
(the POSIX standard tool)
or getopt
(the Gnu tool).
Personally I prefer the Gnu getopt
tool, so I can have
more control over error messages and also to provide for “long”
versions of options.
(e.g., For a help option you might provide both
“-h
” and “--help
”.)
You may use Gnu and Bash extensions (e.g., getopt
,
$RANDOM
, mktemp
, and select
).
Please review the Temporary file
tutorial,
getopt, and other resources from our
class web page.
(Additional getopt
examples can be found
at /usr/share/doc/util-linux-*
on YborStudent.)
In your script, before doing anything interactive check if
any command line options were present.
Use an if
statement and test
command for this.
If there are no options then draw the menu and read the
user's input (interactive stuff).
On the other hand, if command line options were used,
then don't do that.
Just process the command line arguments.
If command line options are present you can use similar
shell statements to the getopt
examples
on the class website.
The idea is to “normalize” the command line arguments
to a standard format that is easy to examine.
You then examine the normalized arguments one at a time.
The easy (and common) way to do this is use a loop, and
set environment variables for each option present.
Later you can easily use tests such as:
if [ "$ADD_OPT" = 1 ]; then ...; fi
/home/wpollock> todo -l 1. Pickup pet weasel 2. Install weasel door 3. Buy some Purina weasel chow 4. Get weasel "fixed" 5. Sell weasel puppies 6. Finish Shell Script project /home/wpollock> todo 1) Add 2) Remove 3) View 4) Help Enter number from menu (q to quit, hit enter to redraw menu): 1 (Add) Enter new task to add (hit enter to cancel): Post project to web site List Updated: 1. Pickup pet weasel 2. Install weasel door 3. Buy some Purina weasel chow 4. Get weasel "fixed" 5. Sell weasel puppies 6. Finish Shell Script project 7. Post project to web site Enter number from menu (q to quit, hit enter to redraw menu): 2 1. Pickup pet weasel 2. Install weasel door 3. Buy some Purina weasel chow 4. Get weasel "fixed" 5. Sell weasel puppies 6. Finish Shell Script project 7. Post project to web site (Remove) Enter task number to remove (hit enter or "q" to cancel): 8 *** You must enter a number between 1 and 7! *** 1. Pickup pet weasel 2. Install weasel door 3. Buy some Purina weasel chow 4. Get weasel "fixed" 5. Sell weasel puppies 6. Finish Shell Script project 7. Post project to web site (Remove) Enter task number to remove (hit enter or "q" to cancel): 6 List Updated: 1. Pickup pet weasel 2. Install weasel door 3. Buy some Purina weasel chow 4. Get weasel "fixed" 5. Sell weasel puppies 6. Post project to web site Enter number from menu (q to quit, hit enter to redraw menu): 1) Add 2) Remove 3) View 4) Help Enter number from menu (q to quit, hit enter to redraw menu): help USAGE: todo [ -d ] [ -l ] [ -a TASK | -r NUM ] todo [ -d ] [ -h | -v ] Options: -d, --debug Turn on debugging mode. -a, --add="TASK" Add the TASK string to the end of the list. -r, --remove=NUM Remove the NUM-th task from the list. -l,--list Display list of to-do tasks to standard output. -h, --help Display this help message. -v, --version Show author and version information. If the -l option is combined with either -a or -r, the modified list will be displayed. Enter number from menu (q to quit, hit enter to redraw menu): q /home/wpollock>
A copy of your script.
You can send as email to . Please see your syllabus for more information about submitting projects.