第九章·shell编程-case流程控制

case语句介绍

case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。

可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

在某些时候,case要优于if,少写很多判断

case语句格式

语法

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

case 工作方式如上所示,取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

用法举例

现实举例

case "你的个人条件" in
          有钱)
                能迎娶白美
                ;;
          有权)
                能迎娶白富美
                ;;
          有才有能力有潜力)
                能找到对象,白不白不一定,富美些许有点够呛
                ;;
          *都不满足)
               研究研究,枕什么样的枕头,可以梦到迎娶白富美吧

程序举例

程序举例 请写一个,跳板机服务,输入1,连接1选项所在的虚拟机

如果要用if判断来实现,得写10个判断,这个时候使用case就比较舒服。

还有之前的ansible模块脚本,把if判断换成case就会很舒服

使用if

[root@zabbix01 ~]# cat if.sh
#!/bin/bash

cat <<EOF
+------------------------+
| 1 172.16.1.7 web01     |
+------------------------+
| 2 172.16.1.8 web02     |
+------------------------+
| 3 172.16.1.31 nfs      |
+------------------------+
| 4 172.16.1.41 backup   |
+------------------------+
| 5 172.16.1.51 db01     |
+------------------------+
| 6 172.16.1.52 db02     |
+------------------------+
| 7 172.16.1.53 db03     |
+------------------------+
| 8 172.16.1.54 db04     |
+------------------------+
| 9 172.16.1.61 m01      |
+------------------------+
| 10 172.16.1.71 zabbix  |
+------------------------+
EOF

read -p '请输入需要连接的主机:' host

if [ $host == '1' -o $host == '172.16.1.7' -o $host == 'web01' ];then
    #ssh 172.16.1.7
    echo '连接 172.16.1.7 web01'
elif [ $host == '2' -o $host == '172.16.1.8' -o $host == 'web02' ];then
    echo '连接 172.16.1.8 web02'
elif [ $host == '3' -o $host == '172.16.1.31' -o $host == 'nfs' ];then
    echo '连接 172.16.1.31 nfs'
elif [ $host == '4' -o $host == '172.16.1.41' -o $host == 'backup' ];then
    echo '连接 172.16.1.41 backup'
elif [ $host == '5' -o $host == '172.16.1.51' -o $host == 'db01' ];then
    echo '连接 172.16.1.51 db01'
elif [ $host == '6' -o $host == '172.16.1.52' -o $host == 'db02' ];then
    echo '连接 172.16.1.52 db02'
elif [ $host == '7' -o $host == '172.16.1.53' -o $host == 'db03' ];then
    echo '连接 172.16.1.53 db03'
elif [ $host == '8' -o $host == '172.16.1.54' -o $host == 'db04' ];then
    echo '连接 172.16.1.54 db04'
elif [ $host == '9' -o $host == '172.16.1.61' -o $host == 'm01' ];then
    echo '连接 172.16.1.61 m01'
elif [ $host == '10' -o $host == '172.16.1.71' -o $host == 'zabbix' ];then
    echo '连接 172.16.1.71 zabbix'
fi

使用case

[root@zabbix01 ~]# cat case.sh
#!/bin/bash
num=$1
case $num in
    1|172.16.1.7|web01)
      echo '连接 172.16.1.7 web01'
      ;;
    2|172.16.1.8|web02)
      echo '连接 172.16.1.8 web02'
      ;;
    3|172.16.1.31|nfs)
      echo '连接 172.16.1.31 nfs'
      ;;
    4|172.16.1.41|backup)
      echo '连接 172.16.1.41 backup'
      ;;
    5|172.16.1.51|db01)
      echo '连接 172.16.1.51 db01'
      ;;
    6|172.16.1.52|db02)
      echo '连接 172.16.1.52 db02'
      ;;
    7|172.16.1.53|db03)
      echo '连接 172.16.1.53 db03'
      ;;
    8|172.16.1.54|db04)
      echo '连接 172.16.1.54 db04'
      ;;
    9|172.16.1.61|m01)
      echo '连接 172.16.1.61 m01'
      ;;
    10|172.16.1.71|zabbix)
      echo '连接 172.16.1.71 zabbix'
      ;;
    *)
      echo '请输入1-10的数字'
esac

Shell中给你点颜色看看

在我们使用shell的时候,难免会有一些带颜色的需求,比如说,在座的各位都喜欢的黄色,那么我们在shell中,如何给字符串加上自己想要的颜色呢?

加颜色的固定格式

\e[1;31m 红色的lw\e[0m

\e \033 \E
字体型号;字体颜色;背景颜色m

[root@zabbix01 ~]# echo -e '\e[1;31m 红色的lw\e[0m'
 红色的lw

 ## 分析
1)开头的   \e 或者 \E 或者 \033  表示开始调整颜色

2)中括号中的第一个数字 1; 这里代表字体的状态
0:表示正常
1:表示加粗
2:变浅
3:斜体
4:下划线
5:闪烁

3)再往后 Nm表示字体颜色
30m:黑色
31m:红色
32m:绿色
33m:黄色
34m:蓝色
35m:紫色
36m:天蓝
37m:白色

4)背景颜色
40:黑底
41:红底
42:绿底
43:黄底
44:蓝底
45:紫底
46:天蓝
47:白底

例:
[root@zabbix01 ~]# echo -e '\e[46;30m 天蓝底黑色的lw\e[0m'

完善跳板机服务

1.判断指定的ip是否可以连接
2.判断退出密码
3.推送秘钥对

#!/bin/bash

menu(){
cat <<EOF
+------------------------+
| 1 172.16.1.7 web01     |
+------------------------+
| 2 172.16.1.8 web02     |
+------------------------+
| 3 172.16.1.31 nfs      |
+------------------------+
| 4 172.16.1.41 backup   |
+------------------------+
| 5 172.16.1.51 db01     |
+------------------------+
| 6 172.16.1.52 db02     |
+------------------------+
| 7 172.16.1.53 db03     |
+------------------------+
| 8 172.16.1.54 db04     |
+------------------------+
| 9 172.16.1.61 m01      |
+------------------------+
| 10 172.16.1.71 zabbix  |
+------------------------+
| 输入 h 查看帮助菜单    |
+------------------------+
| 按 q 退出程序          |
+------------------------+
EOF
}

menu

trap "" HUP INT TSTP
while true;do
read -p '请输入需要连接的主机:' host

    case $host in
        1|172.16.1.7|web01)
            echo '连接 172.16.1.7 web01'
            ;;
        2|172.16.1.8|web02)
            echo '连接 172.16.1.8 web02'
            ;;
        3|172.16.1.31|nfs)
            echo '连接 172.16.1.31 nfs'
            ;;
        h)
            clear
            menu
            ;;
        q)
            exit
            ;;
        *)
            echo "Usage: $0 请输入主机名或者IP或者菜单编号..."
    esac
done

山林不向四季起誓 荣枯随缘