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
Internal pages updates by age:
Latest :
Past week :
Past month :
Past year
InformIT Red Hat Linux 7 Unleashed / Iteration Statements
Copyright © 1996-2012 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. This document is an industrial compilation designed and created
exclusively for educational use and is distributed under the
Softpanorama Content License.
Site uses AdSense so you need to be aware of Google privacy policy. Original materials copyright belong to respective owners. Quotes are made
for educational purposes only in compliance with the fair use doctrine.
This is a Spartan WHYFF (We Help You For Free)
site written by people for whom English is not a native language.
Grammar and spelling errors should be expected.
The site contain some broken links as it develops
like a living tree...
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:
July 11, 2011