分类: LINUX
2009-07-11 17:48:22
here文档是生成菜单的简便方法,而bash提供了另一种循环机制,称为select循环,它主要用于创建菜单。 按数字顺序排列的菜单项将列表显示在标准错误输出上,并显示PS3提示符请求用户输入(默认时,PS3值为“#?”)。显示PS3提示符后,shell等待用户输入,输入的应当是菜单列表中的一个数字。输入值保存在一个shell的特殊变量REPLY中,它与选项列表中相应行的括号右面的字符串相关联。
case命令和select命令联合使用时,用户可以从菜单中进行选择,并基于选项执行相应的命令。LINES和COLUMNS变量,用来确定菜单在终端上的布局(这两个变量是2.x版bash的内置变量,但在此之前的bash版本中没有。如果您所使用的bash shell中它们还没有定义,可以在.bash_profile文件中定义并导出它们)。输出被显示在标准错误上,每一项的开头是一个数字和右括号,PS3提示符显示在菜单底部。因为select命令是一个循环命令,因此,一定要记住用break命令退出循环,或者用exit命令退出脚本程序。
格式
select var in wordlist
do
命令(或命令组)
done
范例14-42
(脚本)
#!/bin/bash
# Scriptname: runit
1 PS3="Select a program to execute: "
2 select program in 'ls -F' pwd date
3 do
4 $program
5 done
(命令行)
Select a program to execute: 2
1) ls -F
2) pwd
3) date
/home/ellie
Select a program to execute: 1
1) ls -F
2) pwd
3) date
12abcrty abc12 doit* progs/ xyz
Select a program to execute: 3
1) ls -F
2) pwd
3) date
Sun Mar 12 13:28:25 PST 2004
说明
1. PS3变量被赋值为提示语句,出现在菜单选项的下面。而默认的PS3提示符为“$#”,并送到标准错误输出上,即屏幕上。
2. select循环由program变量和显示在菜单上的词列表(ls –F,pwd和date)组成。这里列表中的词都是UNIX/Linux命令,当然它们也可以是任何其他的词语,如red,green,yellow,或是cheese,bread,milk,crackers等。如果词语中有空格,就要用引号把词括起来,如 ’ls –F’。
3. do 关键字表示select循环开始。
4. 用户在在菜单中选择数字后,相当于选择了括号右边的词语的值,例如,如果选择了数字2,2与词pwd关联,那么pwd将被赋值给变量program。$program解释为命令pwd,并执行该命令。
5. done命令标志着select循环体中的语句结束,控制返回到循环顶部,循环将一直执行,直到用户按下Ctrl+C组合键。
范例14-43
(脚本)
#!/bin/bash
# Scriptname: goodboys
1 PS3="Please choose one of the three boys : "
2 select choice in tom dan guy
3 do
4 case "$choice" in
tom)
echo Tom is a cool dude!
5 break;; # break out of the select loop
6 dan | guy )
echo Dan and Guy are both wonderful.
break;;
*)
7 echo "$REPLY is not one of your choices" 1>&2
echo "Try again."
;;
8 esac
9 done
(命令行)
$ goodboys
1) tom
2) dan
3) guy
Please choose one of the three boys : 2
Dan and Guy are both wonderful.
$ goodboys
1) tom
2) dan
3) guy
Please choose one of the three boys : 4
4 is not one of your choices
Try again.
Please choose one of the three boys : 1
Tom is a cool dude!
$
说明
1. PS3提示符将打印在菜单的下面。
2. 进入select循环,列表中的词显示为一个按数字排序的菜单。
3. 循环体开始。
4. 变量choice被赋值为列表中的第一个值,然后该值从列表中移出,下一项将为第一个值。
5. break语句把循环控制跳转到第9行。
6. 如果选择了guy或dan,则执行后面的echo命令,echo命令后是break命令,把控制跳转到第9行。
7. 内置的REPLY变量中保存当前列表中选项的序号,如1,2或3。
8. esac标志着case命令的结束。
9. done标志着select循环的结束。