|
Softpanorama
(slightly skeptical)
Open Source Software Educational Society |
May the
source be with you,
but remember the KISS principle ;-)
|
Bash select statement
select allows you to generate simple menus easily. It has concise
syntax, but it does quite a lot of work. The syntax is:
select name [in list]
do
statements that can use $name...
done
This is the same syntax as for except for the keyword select.
And like for, you can omit the in list and it will default
to "$@", i.e., the list of quoted command-line arguments.
Here is what select does:
-
Generates a menu of each item in list, formatted with numbers
for each choice
-
Prompts the user for a number
-
Stores the selected choice in the variable name and the selected
number in the built-in variable REPLY
-
Executes the statements in the body
-
Repeats the process forever (but see below for how to exit)
Once again, an example should help make this process clearer. Assume you
need to write the code for Task 5-4, but your life is not as simple. You don't
have terminals hardwired to your computer; instead, your users communicate through
a terminal server. This means, among other things, that the tty number does
not determine the type of terminal.
Therefore, you have no choice but to prompt the user for his or her terminal
type at login time. To do this, you can put the following code in /etc/profile
(assume you have the same choice of terminal types):
PS3='terminal? '
select term in gl35a t2000 s531 vt99; do
if [[ -n $term ]]; then
TERM=$term
print TERM is $TERM
break
else
print 'invalid.'
fi
done
If you run this code, you will see this menu:
1) gl35a
2) t2000
3) s531
4) vt99
terminal?
The built-in shell variable PS3 contains the prompt string that select uses; its default value is the not particularly useful "#?
". So the first line of the above code sets it to a more relevant value.
The select statement constructs the menu from the list of choices.
If the user enters a valid number (from 1 to 4), then the variable term
is set to the corresponding value; otherwise it is null. (If the user just presses
RETURN, the shell prints the menu again.)
The code in the loop body checks if term is non-null. If so, it assigns
$term to the environment variable TERM and prints a confirmation
message; then the break statement exits the select loop. If term is null, the code prints an error message and repeats the prompt (but
not the menu).
The break statement is the usual way of exiting a select loop.
Actually (like its analog in C), it can be used to exit any surrounding control
structure we've seen so far (except case, where the double-semicolons
act like break) as well as the while and until we will
see soon. We haven't introduced break until now because it is considered
bad coding style to use it to exit a loop. However, it is necessary for exiting
select when the user makes a valid choice. [18]
Let's refine our solution by making the menu more user-friendly, so that
the user doesn't have to know the terminfo name of his or her terminal.
We do this by using quoted character strings as menu items and then using case to determine the termcap name:
print 'Select your terminal type:'
PS3='terminal? '
select term in \
'Givalt VT100' \
'Tsoris VT220' \
'Shande VT320' \
'Vey VT520'
do
case $REPLY in
1 ) TERM=gl35a ;;
2 ) TERM=t2000 ;;
3 ) TERM=s531 ;;
4 ) TERM=vt99 ;;
* ) print 'invalid.' ;;
esac
if [[ -n $term ]]; then
print TERM is $TERM
break
fi
done
This code looks a bit more like a menu routine in a conventional program,
though select still provides the shortcut of converting the menu choices
into numbers. We list each of the menu choices on its own line for reasons of
readability, but once again we need continuation characters to keep the shell
from complaining about syntax.
Here is what the user will see when this code is run:
Select your terminal type:
1) Givalt GL35a
2) Tsoris T-2000
3) Shande 531
4) Vey VT99
terminal?
This is a bit more informative than the previous code's output.
When the body of the select loop is entered, $term equals one
of the four strings (or is null if the user made an invalid choice), while the
built-in variable REPLY contains the number the user selects. We need
a case statement to assign the correct value to TERM; we use the
value of REPLY as the case selector.
Once the case statement is finished, the if checks to see if
a valid choice was made, as in the previous solution. If the choice was valid,
then TERM has already been assigned, so the code just prints a confirmation
message and exits the select loop. If it wasn't valid, the select
loop repeats the prompt and goes through the process again.
The select Statement (pdksh)
The select statement is used to generate a menu list if you
are writing a shell program that expects input from the user online. The
format of the select statement is as follows:
select item in itemlist
do
Statements
done
itemlist is optional. If it's not provided, the system
iterates through the entries in item one at a time. If
itemlist is provided, however, the system iterates for each entry
in itemlist and the current value of itemlist is
assigned to item for each iteration, which then can be used as
part of the statements being executed.
If you want to write a menu that gives the user a choice of picking a
Continue or a Finish, you can write the following
shell program:
#!/bin/bash
select item in Continue Finish
do
if [ $item = "Finish" ]; then
break
fi
done
When the select command is executed, the system displays a
menu with numeric choices to the user--in this case, 1 for
Continue, and 2 for Finish. If the user chooses
1, the variable item contains a value of Continue;
if the user chooses 2, the variable item contains a
value of Finish. When the user chooses 2, the if
statement is executed and the loop terminates.
In case of broken links
please try to use Google search. If you find the page please notify
us about new location
InformIT Red Hat Linux 7 Unleashed Iteration Statements
Copyright © 1996-2008 by Dr. Nikolai Bezroukov.
www.softpanorama.org was
created as a service to the UN Sustainable Development Networking Programme (SDNP)
in the author free time.
Submit
comments This document is an industrial compilation designed and created
exclusively for educational use and is placed under the copyright of the
Open Content License(OPL).
Original materials copyright belong to respective owners. Quotes are made
for educational purposes only in compliance with the fair use doctrine.
Standard disclaimer: The statements, views and opinions presented on
this web page are those of the author and are not endorsed by, nor do they necessarily
reflect, the opinions of the author present and former employers, SDNP or any other
organization the author may be associated with. We do not warrant the correctness
of the information provided or its fitness for any purpose.
Last modified:
June 02, 2008