Selecting from a List of Options
Problem
You need to provide the user with a list of options to choose from and you don’t want to make them type any more than necessary.
Solution
Use bash’s built-in select
construct to generate a menu, then have the user choose by typing
the number of the selection:
# cookbook filename: select_dir directorylist="Finished $(for i in /*;do [ -d "$i" ] && echo $i; done)" PS3='Directory to process? ' # Set a useful select prompt until [ "$directory" == "Finished" ]; do printf "%b" "\a\n\nSelect a directory to process:\n" >&2 select directory in $directorylist; do # User types a number which is stored in $REPLY, but select # returns the value of the entry if [ "$directory" == "Finished" ]; then echo "Finished processing directories." break elif [ -n "$directory" ]; then echo "You chose number $REPLY, processing $directory..." # Do something here break else echo "Invalid selection!" fi # end of handle user's selection done # end of select a directory done # end of until dir == finished
Discussion
The select
function makes it
trivial to present a numbered list to the user on STDERR, from which
they may make a choice. Don’t forget to provide an “exit” or “finished”
choice.
The number the user typed is returned in $REPLY
, and the
value of that entry is returned in the variable you specified in the
select
construct.
See Also
help select
help read
Get bash Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.