命令select一般用来显示字符界面的菜单,命令select的基本格式为:
见表4-3,PS3就是select命令运行时的系统提示,默认值为#?。见下例,有5种蔬菜供选择,脚本运行时,系统会自动按照顺序给每种蔬菜加上编号,用户输入相应的编号进行选择,脚本根据用户的选择显示用户喜爱的蔬菜名。
运行该脚本,分别输入2、5、1后,会发现该脚本是个无穷循环,可以按〈Ctrl+C〉键退出。
〈Ctrl+C〉键是给运行中的脚本发送了中断信号,有“强迫”的味道。如果想“和平”一点,应该让select命令遇到EOF(EndOfFile),〈Ctrl+D〉键是Linux下的EOF。对于上面的脚本,用户可以按〈Ctrl+D〉键“和平地”退出。用〈Ctrl+C〉键退出还是用〈Ctrl+D〉键退出,从表面看,似乎没有区别,实际上完全不一样。假设脚本select_1.sh中select命令关键字done的后面还有其他命令,按〈Ctrl+C〉键时,整个脚本被中断了,done后面的命令不能运行;按〈Ctrl+D〉键时,只是select命令正常退出了,后面的命令可照常运行。
脚本select_1.sh中的select是无穷循环,但通常不会让一个菜单选择成为无穷循环,也不要求用户都知道按〈Ctrl+D〉键可以正常退出一个菜单选择,而是在菜单选择项中增加一个quit。在脚本里,一般菜单选择项quit对应命令break,用命令break跳出循环。
修改脚本select_1.sh,先将PS3的赋值为一个较为合适的提示,然后在供选择的蔬菜当中增加quit,得到脚本select_2.sh:
运行select_2.sh,可见系统提示变为please select your favorite vegetable:,不再是#?。
任意输入1~5之间的数字,会显示相应的蔬菜名。如想退出脚本,输入6,即选择quit,则脚本中的命令break得到执行,select菜单选择命令结束,整个脚本结束,而不用按〈Ctrl+C〉键。
内置变量COLUMNS用于设定select命令的菜单的宽度,即列数,默认为80。内置变量LINES用于设定select命令的在垂直方向上的行数,默认为24。
与for循环一样,select基本格式中的“in列表”不是必须的,如果没有“in列表”,那么“select变量”相当于“select变量in"$@"”,即脚本参数将成为菜单选项。例如,脚本select_3.sh中的select没有“in列表”部分。
运行select_3.sh,参数为beans carrots potatoes onions rutabagas quit,效果与脚本select_2.sh的相同:(www.xing528.com)
从前面的例子可知,select命令在运行时,会自动给列表里面的每个变量值加上编号。这个编号存储在内置变量REPLY中。见脚本select_REPLY.sh,供选择的蔬菜的编号(No.)通过内置变量$REPLY显示。
运行脚本select_REPLY.sh,键盘输入5和2时,相应的蔬菜名字和编号显示出来,在键盘输入6时,脚本退出:
命令select常常与命令case配合。脚本select_case.sh根据选择的蔬菜,显示相应的价格。在脚本select_case.sh中,假设beans和potatoes的价格都是2.58,carrots和rutabagas的价格都是3.65,onions的价格是4.12。case命令中的*)部分是对不在列表里面的键盘输入进行处理。
运行select_case.sh,键盘输入1~5间的数字,则显示相应的蔬菜名和价格,输入1~5之外的数字,则提示输入错误并要求用户重新输入:
前面已经解释了内置变量REPLY的作用。把脚本select_case.sh中case命令的变量由vegetable换为REPLY,beans|potatoes)要相应地变为1|3),得到脚本select_case_REPLY.sh,它与脚本select_case.sh的作用完全一致。
运行select_case_REPLY.sh,键盘输入1~5间的数字,显示相应的蔬菜名和价格,输入1~5之外的数字,提示输入错误并要求用户重新输入:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。