The select statement constructs
the menu from the list of choices. If the user enters a valid
number (from 1 to 4), the variable term is set to
the corresponding value; otherwise it is null. (If the user
just presses ENTER, 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,
exports 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).
print 'Select your terminal type:'
PS3='terminal? '
select term in \
'Givalt GL35a' \
'Tsoris T-2000' \
'Shande 531' \
'Vey VT99'
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
export 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 sees 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.
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, TERM
has already been assigned, so the code just prints a confirmation message,
exports TERM, and exits the select
loop. If it wasn't valid, the select loop repeats
the prompt and goes through the process again.
Within a select loop, if REPLY is set
to the null string, the shell reprints the menu.
This happens, as mentioned, when the user hits ENTER.
But you may also explicitly set REPLY to the
null string to force the shell to reprint the menu.