15.4 select循环
select是一种菜单扩展循环方式,其语法和带列表的for循环非常类似,基本结构如下:
- select MENU in (list)
do
command
done
当程序运行到select语句时,会自动将列表中的所有元素生成为可用1、2、3等数选择的列表,并等待用户输入。用户输入并回车后,select可判断输入并执行后续命令。如果用户在等待输入的光标后直接按回车键,select将不会退出而是再次生成列表等待输入。示例如下:
- [root@localhost ~]# cat select01.sh
#!/bin/bash
echo "Which car do you prefer?"
select CAR in Benz Audi VolksWagen
do
break #
这里用到了没有讲过的break
语句,这将在15.6
小节中讲到
done
echo "You chose $CAR"
#
运行结果
[root@localhost ~]# bash select01.sh
Which car do you prefer?
1) Benz
2) Audi
3) VolksWagen
#? #
此处尝试直接回车,结果select
再次生成了列表等待输入
1) Benz
2) Audi
3) VolksWagen
#? 2#
此处选择2
,程序会退出select
并继续执行后面的语句
You chose Audi
通过上面的例子可以发现,select有判断用户输入的功能,所以select经常和case语句合并使用。
下面的例子使用select确认用户的输入并交由case处理,之后将根据不同输入执行不同代码段。代码中使用了“|”符,表示选择Saturday和Sunday的效果是一致的。
- [root@localhost ~]# cat select02.sh
#!/bin/bash
select DAY in Mon Tue Wed Thu Fri Sat Sun
do
case $DAY in
Mon) echo "Today is Monday";;
Tue) echo "Today is Tuesday";;
Wed) echo "Today is Wednesday";;
Thu) echo "Today is Thursday";;
Fri) echo "Today is Friday";;
Sat|Sun) echo "You can have a rest today";;
*) echo "Unknown input, exit now" && break;;
esac
done
#
运行结果
[root@localhost ~]# bash select02.sh
1) Monday 3) Wednesday 5) Friday 7) Sunday
2) Tuesday 4) Thursday 6) Saturday
#? 1
Today is Monday
#? 6
You can have a rest today
#? 7
You can have a rest today
#? 8
Unknown input, exit now