【linux 脚本篇】流程控制语句-case

简介: 【linux 脚本篇】流程控制语句-case

       用来实现程序流程的选择、循环等进行控制,类似于if,但更具准确性,一般用于服务的启动、停止脚本。

语法格式如下:

1. case 变量 in
2.     变量1)
3.         命令序列1;;
4.     变量2)
5.         命令序列2;;
6.     变量3)
7.         命令序列3;;
8. esac

       这种语句,需要做大量的练习,下面来几个案例,其他的可以在网上搜。为了区分if和case的区别,下面案例使用两种语法实现。

案例一:菜单选项

       实现方法分别用if语句和case语句展示,先来看看if语句是怎么实现的吧。

if语句执行

       下面使用了多分支if语句,来判断123,但是这种语法不够精确。可以加入更多的正则表达式,来增加精确性,但是这样不太实用,我们的理念是用最少的语法命令,做更多更便捷的事。

1. [root@daxia ~]# vim if1.sh
2. #!/bin/bash
3. cat << EOF
4. =========+
5. 1.backup |
6. 2.copy   |
7. 3.quit   |
8. =========+
9. EOF
10. read -p "请输入你的选项[1|2|3]:" as
11. 
12. if [ ${as} -eq 1 ];then
13. echo "==backup=="
14. elif [ ${as} -eq 2 ];then
15. echo "==copy=="
16. elif [ ${as} -eq 3 ];then
17. echo "==quit=="
18. else
19. echo "已退出;请输入[1|2|3]"
20. fi

执行脚本测试

1. [root@daxia ~]# sh if1.sh 
2. =========+
3. 1.backup |
4. 2.copy   |
5. 3.quit   |
6. =========+
7. 请输入你的选项[1|2|3]:1
8. ==backup==
9. [root@daxia ~]# sh if1.sh 
10. =========+
11. 1.backup |
12. 2.copy   |
13. 3.quit   |
14. =========+
15. 请输入你的选项[1|2|3]:2
16. ==copy==
17. [root@daxia ~]# sh if1.sh 
18. =========+
19. 1.backup |
20. 2.copy   |
21. 3.quit   |
22. =========+
23. 请输入你的选项[1|2|3]:3
24. ==quit==
25. [root@daxia ~]# sh if1.sh 
26. =========+
27. 1.backup |
28. 2.copy   |
29. 3.quit   |
30. =========+
31. 请输入你的选项[1|2|3]:4
32. 已退出;请输入[1|2|3]

case语句执行

1. #!/bin/bash
2. cat <<EOF
3. =========+
4. 1.backup |
5. 2.copy   |
6. 3.quit   |
7. =========+
8. EOF
9. 
10. read -p "请输入你的选项[1|2|3]:" as
11. 
12. case ${as} in
13.     1)
14. echo "==backup=="
15.     ;;
16.     2)
17. echo "==copy=="
18.     ;;
19.     3)
20. echo "==quit==" && exit
21.     ;;
22.     *)
23. echo "警告!!!!"
24. echo "执行${0}后,请输入 {1|2|3}"
25. exit
26. esac
27. [root@daxia ~]# vim case1.sh
28. #!/bin/bash
29. cat <<EOF
30. =========+
31. 1.backup |
32. 2.copy   |
33. 3.quit   |
34. =========+
35. EOF
36. 
37. read -p "请输入你的选项[1|2|3]:" as
38. 
39. case ${as} in
40.     1)
41. echo "==backup=="
42.     ;;
43.     2)
44. echo "==copy=="
45.     ;;
46.     3)
47. echo "==quit==" && exit
48.     ;;
49.     *)
50. echo "!!!!大虾警告!!!!"
51. echo "执行${0}后,请输入 {1|2|3}"
52. exit
53. esac

执行脚本测试

1. [root@daxia ~]# sh case1.sh 
2. =========+
3. 1.backup |
4. 2.copy   |
5. 3.quit   |
6. =========+
7. 请输入你的选项[1|2|3]:1
8. ==backup==
9. [root@daxia ~]# sh case1.sh 
10. =========+
11. 1.backup |
12. 2.copy   |
13. 3.quit   |
14. =========+
15. 请输入你的选项[1|2|3]:2
16. ==copy==
17. [root@daxia ~]# sh case1.sh 
18. =========+
19. 1.backup |
20. 2.copy   |
21. 3.quit   |
22. =========+
23. 请输入你的选项[1|2|3]:3    
24. ==quit==
25. [root@daxia ~]# sh case1.sh 
26. =========+
27. 1.backup |
28. 2.copy   |
29. 3.quit   |
30. =========+
31. 请输入你的选项[1|2|3]:4
32. !!!!大虾警告!!!!
33. 执行case1.sh后,请输入 {1|2|3}

案例二:rsync服务脚本

       案例思路: rsync的启动命令: rsync --daemon rsync的停止命令: pkill rsync

if语句执行

1. [root@daxia ~]# vim if2.sh
2. #!/bin/bash
3. source /etc/init.d/functions
4. 
5. if [ $1 == "start" ];then
6.     rsync --daemon
7.     action "rsync starting..." /bin/true
8. elif [ $1 == "stop" ];then
9.     pkill rsync
10.     action "rsync stoping..." /bin/true
11. else
12. echo "USAGE: $0 {start|stop}"
13. exit
14. fi

执行脚本测试

1. [root@daxia ~]# sh if2.sh start
2. rsync starting...                                          [  确定  ]
3. [root@daxia ~]# sh if2.sh stop
4. rsync stoping...                                           [  确定  ]

case语句执行

1. [root@daxia ~]# vim case2.sh
2. #!/bin/bash
3. source /etc/init.d/functions
4. 
5. case $1 in
6.     start)
7. if [ ! -f /var/run/rsync.pid ];then
8. touch /var/run/rsync.pid
9.       rsync --daemon
10.       action "rsync starting.." /bin/true
11. else
12.       action "rsync service running..." /bin/false
13. fi
14.     ;;
15.     stop)
16. rm -f /var/run/rsync.pid
17.      pkill rsync
18.      action "rsync stopping..."/bin/true
19.     ;;
20.     status)
21. if [ ! -f /var/run/rsync.pid ];then
22. echo "rsync service status InActive.."
23. else
24.       rsync_status=$(ps aux |grep -v grep | awk '{print $2}')
25. echo "rsync service status Active("$rsync_status")"
26. fi
27.     ;;
28.     *)
29. echo "USAGE:$0{start|stop|status}"
30. exit
31. esac

执行脚本测试

1. [root@daxia ~]# sh case2.sh start
2. rsync starting..                                           [  确定  ]
3. [root@daxia ~]# sh case2.sh status
4. rsync service status Active(PID 1 2 4 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24 30 31 32 33 41 43 44 45 47 60 97 274 275 276 277 283 284 288 289 291 292 297 298 328 370 371 380 381 394 395 396 397 398 399 400 401 402 403 404 483 568 572 574 578 580 582 583 584 656 692 701 715 730 785 1211 1216 1315 1738 1742 1785 1789 2351 2608 20877 21461 21462 21498 21531 21571 21622 21673 21702 35033 49365 49824 49828 49895 50046 50050 50051 50057 50353 50354 50358 50449 50453 78262 78273 78357 78380 78393 78395 78400 78401 78403)
5. [root@daxia ~]# sh case2.sh stop
6. rsync stopping.../bin/true                                 [  确定  ]

案例三:nginx服务脚本

案例思路: 如何启动 /usr/sbin/nginx 如何停止 /usr/sbin/nginx -s stop 如何重载

1. [root@daxia ~]# vim case3.sh
2. #!/bin/bash
3. source /etc/init.d/functions
4. case $1 in
5.  start)
6.    if [ -f /var/run/nginx.pid ];then
7.      action "nginx服务已启动..." /bin/false
8.      exit
9.    else
10.       /usr/sbin/nginx
11.       action "nginx服务启动成功..." /bin/true
12.     fi
13.     ;;
14.   stop)
15.     if [ -f /var/run/nginx.pid ];then
16.       /usr/sbin/nginx -s stop 
17.       if [ $? -eq 0 ];then
18.         action "nginx服务关闭成功..." /bin/true
19.       else
20.         action "nginx服务关闭失败..." /bin/false
21.       fi
22.     else
23.       action "nginx服务已经关闭..." /bin/false  
24.     fi
25.     ;;
26.   reload)
27.     if [ -f /var/run/nginx.pid ];then
28.       /usr/sbin/nginx -s reload
29.       if [ $? -eq 0 ];then
30.         action "nginx重载成功..." /bin/true
31.       else
32.         action "nginx重载失败..." /bin/false
33.       fi
34.     else
35.       action "nginx没有启动,无法完成重载" /bin/false
36.     fi
37.     ;;
38.   status)
39.     if [ -f /var/run/nginx.pid ];then
40.       nginx_pid=$(cat /var/run/nginx.pid)
41.       echo "nginx ( $nginx_pid ) is running..."
42.     else
43.       echo "nginx is not running..."
44.     fi
45.     ;;
46.   *)
47.     echo "USAGE: $0 {start|stop|status}"
48. esac

执行脚本测试

1. [root@daxia ~]# sh case3.sh start
2. nginx服务启动成功...                                       [  确定  ]
3. [root@daxia ~]# sh case3.sh reload
4. nginx重载成功...                                           [  确定  ]
5. [root@daxia ~]# sh case3.sh status
6. nginx ( 98699 ) is running...
7. [root@daxia ~]# sh case3.sh stop
8. nginx服务关闭成功...                                       [  确定  ]

案例四:实现系统工具箱

1. [root@daxia ~]# vim case4.sh
2. #!/bin/bash
3. cat <<EOF
4. +++++++++++++++
5. h 显示命令帮助+
6. f 显示分区使用+
7. d 显示磁盘挂载+
8. m 查看内存使用+
9. u 查看cpu负载 +
10. q 退出        +
11. +++++++++++++++
12. EOF
13. 
14. read -p "请输入你的选项:" SZ
15. 
16. case $SZ in
17.   f)
18.     df -hT
19.     ;;
20.   d)
21.     mount | more
22.     ;;
23.   m)
24.     free -h
25.     ;;
26.   u)
27.     uptime
28.     ;;
29.   q)
30.     exit
31.     ;;
32.   *)
33.     echo "USAGE: $0 【h|f|d|m|u|q】"
34. esac

案例五:实现简单的jumpserver跳板机

       案例思路: 需要看到所有能管理的主机 选择菜单,提示输入某个主机IP地址分为公有和私有地址 私有地址: A 10.0.0.0 -10.255.255.255 B 172.16.0.0 - 172.31.255.255 C 192.168.0.0 - 192.168.255.255

       配置前先配置互信和本地解析 通过秘钥访问(无密码)最安全。 在跳板机产生一对秘钥(公钥、私钥)采用方式:公钥加密,私钥解密,将公钥放到对端服务器上。

打开四台虚拟机ip分别是10、11、12、13,下面配置每台都配置互信,本地解析。

(1)生成公钥id_rsa.pub和私钥id_rsa(保存在宿主目录下.ssh)

[root@node1 ~]# ssh-keygen -t rsa

(2)将公钥传给对端服务器

[root@node1 ~]# for i in 10 11 12 13;do ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.8.$i;done

(3)可以将对方ip和主机名进行本地解析

1. [root@node1 ~]# vim /etc/hosts
2. 192.168.8.10 node1
3. 192.168.8.11 node2
4. 192.168.8.12 node3
5. 192.168.8.13 node4

(4)将/etc/hosts 文件拷贝给所有服务器

[root@node1 ~]# for i in 10 11 12 13;do scp /etc/hosts root@192.168.8.$i:/etc/; done

最后使用case来制作一个脚本吧,注意这里是node1主机,四台都做了互信,都可以执行脚本操作。(里面的function后面再讲)

1. [root@node1 ~]# vim case5.sh
2. #!/bin/bash
3. 
4. Menu(){
5. cat <<EOF
6. 1.node1-192.168.8.10
7. 2.node2-192.168.8.11
8. 3.node3-192.168.8.12
9. 4.node4-192.168.8.13
10. h.help
11. EOF
12. }
13. 
14. Menu
15. 
16. read -p "请输入你要连接的主机序号:" CONN
17. case $CONN in
18.     1)
19.     ssh root@192.168.8.10
20.     ;;
21.     2)
22.     ssh root@192.168.8.11
23.     ;;
24.     3)
25.     ssh root@192.168.8.12
26.     ;;
27.     4)  
28.     ssh root@192.168.8.13
29.     ;;
30.     h)
31.     clear
32.     Menu
33.     ;;
34.     *)
35. echo "USAGE: $0 输入要连接的主机序号 【1|2|3|4】"
36. esac


相关文章
|
2月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
180 6
|
18天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
22天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
37 1
|
2月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
479 2
|
1月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
26 0
|
2月前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
|
7天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
31 3
|
7天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
26 2
|
15天前
|
缓存 监控 Linux
下一篇
无影云桌面