15.4 select循环

select是一种菜单扩展循环方式,其语法和带列表的for循环非常类似,基本结构如下:


  1. select MENU in (list)

  2. do

  3. command

  4. done


当程序运行到select语句时,会自动将列表中的所有元素生成为可用1、2、3等数选择的列表,并等待用户输入。用户输入并回车后,select可判断输入并执行后续命令。如果用户在等待输入的光标后直接按回车键,select将不会退出而是再次生成列表等待输入。示例如下:


  1. [root@localhost ~]# cat select01.sh

  2. #!/bin/bash

  3. echo "Which car do you prefer?"

  4. select CAR in Benz Audi VolksWagen

  5. do

  6. break #

  7. 这里用到了没有讲过的break

  8. 语句,这将在15.6

  9. 小节中讲到

  10. done

  11. echo "You chose $CAR"

  12. #

  13. 运行结果

  14. [root@localhost ~]# bash select01.sh

  15. Which car do you prefer?

  16. 1) Benz

  17. 2) Audi

  18. 3) VolksWagen

  19. #? #

  20. 此处尝试直接回车,结果select

  21. 再次生成了列表等待输入

  22. 1) Benz

  23. 2) Audi

  24. 3) VolksWagen

  25. #? 2#

  26. 此处选择2

  27. ,程序会退出select

  28. 并继续执行后面的语句

  29. You chose Audi


通过上面的例子可以发现,select有判断用户输入的功能,所以select经常和case语句合并使用。

下面的例子使用select确认用户的输入并交由case处理,之后将根据不同输入执行不同代码段。代码中使用了“|”符,表示选择Saturday和Sunday的效果是一致的。


  1. [root@localhost ~]# cat select02.sh

  2. #!/bin/bash

  3. select DAY in Mon Tue Wed Thu Fri Sat Sun

  4. do

  5. case $DAY in

  6. Mon) echo "Today is Monday";;

  7. Tue) echo "Today is Tuesday";;

  8. Wed) echo "Today is Wednesday";;

  9. Thu) echo "Today is Thursday";;

  10. Fri) echo "Today is Friday";;

  11. Sat|Sun) echo "You can have a rest today";;

  12. *) echo "Unknown input, exit now" && break;;

  13. esac

  14. done

  15. #

  16. 运行结果

  17. [root@localhost ~]# bash select02.sh

  18. 1) Monday 3) Wednesday 5) Friday 7) Sunday

  19. 2) Tuesday 4) Thursday 6) Saturday

  20. #? 1

  21. Today is Monday

  22. #? 6

  23. You can have a rest today

  24. #? 7

  25. You can have a rest today

  26. #? 8

  27. Unknown input, exit now