select也是循环的一种,它比较适合用在用户选择的情况下。
比如,我们有一个这样的需求,运行脚本后,让用户去选择数字,选择1,会运行w命令,选择2运行top命令,选择3运行free命令,选择4退出。脚本这样实现:

  1. #!/bin/bash

  2. echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"

  3. echo

  4. select command in w top free quit

  5. do

  6. case $command in

  7. w)

  8. w

  9. ;;

  10. top)

  11. top

  12. ;;

  13. free)

  14. free

  15. ;;

  16. quit)

  17. exit

  18. ;;

  19. *)

  20. echo "Please input a number:(1-4)."

  21. ;;

  22. esac

  23. done



执行结果如下:
sh select.sh
Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit

1) w
2) top
3) free
4) quit
#? 1
16:03:40 up 32 days,  2:42,  1 user,  load average: 0.01, 0.08, 0.08
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    61.135.172.68    15:33    0.00s  0.02s  0.00s sh select.sh

#? 3
            total       used       free     shared    buffers     cached
Mem:       1020328     943736      76592          0      86840     263624
-/+ buffers/cache:     593272     427056
Swap:      2097144      44196     2052948
#?


我们发现,select会默认把序号对应的命令列出来,每次输入一个数字,则会执行相应的命令,命令执行完后并不会退出脚本。它还会继续让我们再次输如序号。序号前面的提示符,我们也是可以修改的,利用变量PS3即可,再次修改脚本如下:
  1. #!/bin/bash

  2. PS3="Please select a number: "

  3. echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"

  4. echo


  5. select command in w top free quit

  6. do

  7. case $command in

  8. w)

  9. w

  10. ;;

  11. top)

  12. top

  13. ;;

  14. free)

  15. free

  16. ;;

  17. quit)

  18. exit

  19. ;;

  20. *)

  21. echo "Please input a number:(1-4)."

  22. esac

  23. done



如果想要脚本每次输入一个序号后就自动退出,则需要再次更改脚本如下:
  1. #!/bin/bash

  2. PS3="Please select a number: "

  3. echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"

  4. echo


  5. select command in w top free quit

  6. do

  7. case $command in

  8. w)

  9. w;exit

  10. ;;

  11. top)

  12. top;exit

  13. ;;

  14. free)

  15. free;exit

  16. ;;

  17. quit)

  18. exit

  19. ;;

  20. *)

  21. echo "Please input a number:(1-4).";exit

  22. esac

  23. done