Bash’s select keyword has been under my radar for very long time, I always keep an eye on it whenever I was reading a shell script, but I just couldn’t recall once that I had seen it being used in real script. Needless to say, I’ve never used it.
What it provides is a very simple user interface for getting an input from user, who choices one from a list. It’s very similar to case and loops. In fact, I would say it’s a combination of both. The syntax is:
$ help select
select: select NAME [in WORDS ... ;] do COMMANDS; done
Select words from a list and execute commands.
The WORDS are expanded, generating a list of words. The
set of expanded words is printed on the standard error, each
preceded by a number. If `in WORDS' is not present, `in "$@"'
is assumed. The PS3 prompt is then displayed and a line read
from the standard input. If the line consists of the number
corresponding to one of the displayed words, then NAME is set
to that word. If the line is empty, WORDS and the prompt are
redisplayed. If EOF is read, the command completes. Any other
value read causes NAME to be set to null. The line read is saved
in the variable REPLY. COMMANDS are executed after each selection
until a break command is executed.
Exit Status:
Returns the status of the last command executed.
Quick example:
$ PS3='Which dir? ' ; select d in /*; do echo "$d"; done 1) /bin 4) /etc 7) /lib64 10) /opt 13) /run 16) /tmp 2) /boot 5) /home 8) /lost+found 11) /proc 14) /sbin 17) /usr 3) /dev 6) /lib 9) /mnt 12) /root 15) /sys 18) /var Which dir?
Since it does act like loop, so the exit condition is important. You can add an additional option like 'Quit' or check if input is valid:
[[ -z $input ]] && break [[ $input = Quit ]] && break
When user’s input is not a valid option, the variable is set to empty string. Note that no matter what the input is, $REPLY always gets the input. For example:
$ select input in a b c; do > echo "input = $input" > echo "REPLY = $REPLY" > done 1) a 2) b 3) c #? 1 input = a REPLY = 1 #? invalid input = REPLY = invalid #?
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.