一、条件循环语句-case

在生产环境中,我们总会遇到一个问题需要根据不同的状况来执行不同的预案,那么我们要处理这样的问题就要首先根据可能出现的情况写出对应预案,根据出现的情况来加载不同的预案。

1.1、case介绍

特点:根据给予的不同条件执行不同的代码块

  1. 比如你去相亲:你会在脑子里出现以下的预案:
  2. 第一眼看到对方父亲,你应该说:伯父好
  3. 第一眼看到对方母亲,你应该说:伯母好
  4. 第一眼看到对方奶奶,你应该说:奶奶好
  5. 。。。。
  6. 而这个例子中触发就是你第一眼看到了对方的谁,预案则是叫什么称呼。
  7. 再来说一个计算机的相关例子---监控内存使用率
  8. 内存使用率低于80%,脚本输出: 绿色字体的Memory use xx%
  9. 内存使用率大于80%小于90%,脚本输出: 黄色字体的Memory use xx%
  10. 内存使用大于90%,脚本输出: 红色字体的Memory use xx%

1.2、case语法

  1. case $var in 定义变量;var代表是变量名
  2. pattern 1) 模式1;用 | 分割多个模式,相当于or
  3. command1 需要执行的语句
  4. ;; 两个分号代表命令结束
  5. pattern 2)
  6. command2
  7. ;;
  8. pattern 3)
  9. command3
  10. ;;
  11. *) default,不满足以上模式,默认执行*)下面的语句
  12. command4
  13. ;;
  14. esac esac表示case语句结束

1.3、案例

案例需求
写一个nginx启动管理脚本,可以实现/etc/init.d/nginx start|stop|restart|status|reload
或者
systemctl start nginx

  1. #!/bin/bash
  2. #Description:
  3. #Author: www.zutuanxue.com
  4. #Created Time:
  5. #nginx service manage script
  6. #variables
  7. nginx_install_doc=/usr/local/nginx
  8. proc=nginx
  9. nginxd=$nginx_install_doc/sbin/nginx
  10. pid_file=$nginx_install_doc/logs/nginx.pid
  11. # Source function library.
  12. if [ -f /etc/init.d/functions ];then
  13. . /etc/init.d/functions
  14. else
  15. echo "not found file /etc/init.d/functions"
  16. exit
  17. fi
  18. #假如pid文件存在,那么统计一下nginx进程数量
  19. if [ -f $pid_file ];then
  20. nginx_process_id=`cat $pid_file`
  21. nginx_process_num=`ps aux |grep $nginx_process_id|grep -v "grep"|wc -l`
  22. fi
  23. #function
  24. start () {
  25. #如果nginx 没有启动直接启动,否则报错 已经启动
  26. if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
  27. echo "nginx running..."
  28. else
  29. #如果pid文件存在,但是没有进程,说明上一次非法关闭了nginx,造成pid文件没有自动删除,所以启动nginx之前先删除旧的pid文件
  30. if [ -f $pid_file ] && [ $nginx_process_num -lt 1 ];then
  31. rm -f $pig_file
  32. #可以使用两个函数,两种方法来执行命令,并返回执行结果
  33. #1)daemon
  34. #2)action 建议这个,简单易用
  35. #echo " nginx start `daemon $nginxd` "
  36. action "nginx start" $nginxd
  37. fi
  38. #echo " nginx start `daemon $nginxd` "
  39. action "nginx start" $nginxd
  40. fi
  41. }
  42. stop () {
  43. #判断nginx启动的情况下才会执行关闭,如果没启动直接报错,或者提示用户服务没启动,这里我直接报错的原因是为了给大家演示失败的输出
  44. if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
  45. action "nginx stop" killall -s QUIT $proc
  46. rm -f $pid_file
  47. else
  48. action "nginx stop" killall -s QUIT $proc 2>/dev/null
  49. fi
  50. }
  51. restart () {
  52. stop
  53. sleep 1
  54. start
  55. }
  56. reload () {
  57. #重载的目的是让主进程重新加载配置文件,但是前提是服务必须开启
  58. #这里先判断服务是否开启,开启就执行加载,没有开启直接报加载错误
  59. if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
  60. action "nginx reload" killall -s HUP $proc
  61. else
  62. action "nginx reload" killall -s HUP $proc 2>/dev/null
  63. fi
  64. }
  65. status () {
  66. if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
  67. echo "nginx running..."
  68. else
  69. echo "nginx stop"
  70. fi
  71. }
  72. #callable
  73. case $1 in
  74. start) start;;
  75. stop) stop;;
  76. restart) restart;;
  77. reload) reload;;
  78. status) status;;
  79. *) echo "USAGE: $0 start|stop|restart|reload|status";;
  80. esac