select循环用来增强交互性,它可以显示出带编号的菜单,用户输入不同的编号就可以选择不同的菜单,并执行不同的功能。是bash的一种扩展应用,非常适合终端(Terminal)这样的交互场景
语法
语法和for语句一样,var表示变量,strlist表示取值列表(strlist同样支持多种形式)
运行到select语句后,取值列表strlist中的内容会以菜单的形式显示出来每次循环时select都会要求用户输入菜单编号,并使用环境变量PS3的值作为提示符(PS3的默认值为’#?’,修改PS3的值就可以修改提示符)用户输入菜单编号,就表示选中了某个值,这个值就会赋给变量var然后再执行循环体中的command如果用户输入的菜单编号不在范围之内,那么就会给var赋一个空值如果用户输入一个空值(什么也不输入,直接回车),会重新显示一遍菜单select var in strlist do command done 1234 注意事项 select是无限循环(死循环),输入空值或者输入的值无效,都不会结束循环,只有遇到break语句,或者按下ctrl+d组合键才能结束循环
strlist的表现形式
直接给出strlist
select var in item1 item2 ... itemN do command done 1234
变量的形式
select var in $* do command done strlist="a b c d" select var in ${strlist} do command done 12345678910
命令的形式
select var in $(ls ${PATH}) do command done select var in `ls ${PATH}` do command done 123456789
文件路径的形式
select var in /proc/* do command done # "*" 匹配当前目录下的所有文件 select var in * do command done 12345678910
取值范围的形式
select var in {1..10} do command done # 根据 ASCII 码表顺序 select var in {A..z} do command done 12345678910
省略strlist的形式
# 此处strlist隐式声明为"$@" select var do command done 12345
示例
select通常和case一起使用,在用户输入不同的编号时可以做出不同的反应
#!/bin/bash echo "What is your favorite OS?" PS3="Input the OS id: " select os in "Linux" "Windows" "Mac OS" "UNIX" "Android" do case $os in "Linux") echo "Linux是一个类UNIX操作系统,它开源免费,运行在各种服务器设备和嵌入式设备。" break ;; "Windows") echo "Windows是微软开发的个人电脑操作系统,它是闭源收费的。" break ;; "Mac OS") echo "Mac OS是苹果公司基于UNIX开发的一款图形界面操作系统,只能运行与苹果提供的硬件之上。" break ;; "UNIX") echo "UNIX是操作系统的开山鼻祖,现在已经逐渐退出历史舞台,只应用在特殊场合。" break ;; "Android") echo "Android是由Google开发的手机操作系统,目前已经占据了70%的市场份额。" break ;; *) echo "输入错误,请重新输入" esac done echo "Your favorite OS is $os"
12345678910111213141516171819202122232425262728293031323334