[toc]

case语句介绍

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

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

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

case语句格式

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
casein
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac

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

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

现实举例

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

程序举例

请写一个,阿拉伯数字1-10转中文大写的程序,输入1,打印 壹…

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

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

使用if

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 编辑脚本
vim if.sh
#!/bin/bash
num=$1

if [ $num -eq 1 ];then
echo '壹'
elif [ $num -eq 2 ];then
echo '贰'
elif [ $num -eq 3 ];then
echo '叁'
elif [ $num -eq 4 ];then
echo '肆'
elif [ $num -eq 5 ];then
echo '伍'
elif [ $num -eq 6 ];then
echo '陆'
elif [ $num -eq 7 ];then
echo '柒'
elif [ $num -eq 8 ];then
echo '捌'
elif [ $num -eq 9 ];then
echo '玖'
elif [ $num -eq 10 ];then
echo '拾'
else
echo '请输入1-10的数字'
fi

使用case

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 编辑脚本
vim case.sh
#!/bin/bash
num=$1
case $num in
1)
echo '壹'
;;
2)
echo '贰'
;;
3)
echo '叁'
;;
4)
echo '肆'
;;
5)
echo '伍'
;;
6)
echo '陆'
;;
7)
echo '柒'
;;
8)
echo '捌'
;;
9)
echo '玖'
;;
10)
echo '拾'
;;
*)
echo '请输入1-10的数字'
esac

# 运行脚本
sh case.sh 1

sh case.sh 2

sh case.sh 3

sh case.sh 4

sh case.sh 5

sh case.sh 6

sh case.sh 7

sh case.sh 8

sh case.sh 9

sh case.sh 10

sh case.sh 11
请输入1-10的数字
sh case.sh 12
请输入1-10的数字

Shell中调整颜色

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

加颜色的固定格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 示例
echo -e '\e[1;31m 红色的zls\e[0m'
红色的zls

# 分析
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:白底

例:
echo -e '\e[46;30m 天蓝底黑色的zls\e[0m'

实战练习:根据菜单安装对应的架构

方案一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/bin/bash
cat <<EOF
+------------------+
+ | 1.lnmp + | +
+------------------+
+ | 2.lnmt + | +
+------------------+
+ | 3.lamt + | +
+------------------+
+ | 4.lamp + | +
+------------------+
+ | 5.nginx + | +
+------------------+
+ | 6.apache + | +
+------------------+
+ | 7.tomcat + | +
+------------------+
+ | 8.zabbix + | +
+------------------+
EOF
check() {
service=$1
rpm -q $service >> /dev/null
if [ $? -eq 0 ];then
echo "已安装$service 请勿重复安装"
return 1
fi
}

install() {
check $1
if [ $? -ne 1 ];then
echo "未检测到$service 正在为你安装"
yum install -y $service
fi
}

read -p '请输入数字或者服务名: ' num

if [ $num == "5" -o $num == "nginx" ];then
install nginx
elif [ $num == "6" -o $num == "apache" ];then
install httpd
elif [ $num == "7" -o $num == "tomcat" ];then
install tomcat
elif [ $num == "8" -o $num == "zabbix" ];then
install zabbix
else
echo "请根据目录输入指定选项"
fi

优化方案二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash
cat <<EOF
+------------------+
+ | 1.lnmp + | +
+------------------+
+ | 2.lnmt + | +
+------------------+
+ | 3.lamt + | +
+------------------+
+ | 4.lamp + | +
+------------------+
+ | 5.nginx + | +
+------------------+
+ | 6.apache + | +
+------------------+
+ | 7.tomcat + | +
+------------------+
+ | 8.zabbix + | +
+------------------+
EOF

check_and_install() {
service=$1
rpm -q $service >> /dev/null
if [ $? -eq 0 ];then
echo "已安装$service 请勿重复安装"
else
echo "未检测到$service 正在为你安装"
yum install -y $service
fi
}

read -p '请输入数字或者服务名: ' num

if [ $num == "5" -o $num == "nginx" ];then
check_and_install nginx
elif [ $num == "6" -o $num == "apache" ];then
check_and_install httpd
elif [ $num == "7" -o $num == "tomcat" ];then
check_and_install tomcat
elif [ $num == "8" -o $num == "zabbix" ];then
check_and_install zabbix
else
echo "请根据目录输入指定选项"
fi

实战:编写跳板机脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/bin/bash
cat <<EOF
+---------------------------+
+ | 1 172.16.1.5 lb01 | +
+---------------------------+
+ | 2 172.16.1.6 lb02 | +
+---------------------------+
+ | 3 172.16.1.7 web01 | +
+---------------------------+
+ | 4 172.16.1.8 web02 | +
+---------------------------+
+ | 5 172.16.1.9 web03 | +
+---------------------------+
+ | 6 172.16.1.31 nfs | +
+---------------------------+
+ | 7 172.16.1.41 backup | +
+---------------------------+
+ | 8 172.16.1.51 db01 | +
+---------------------------+
+ | 9 172.16.1.52 db02 | +
+---------------------------+
+ | 10 172.16.1.71 zabbix | +
+---------------------------+
EOF

. /etc/init.d/functions
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for n in 5 6 7 8 9 31 41 51 52 71;do
sshpass -p 1 ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@10.0.0.$n &>/dev/null && \
action "10.0.0.$n send public key " /bin/true || \
action "10.0.0.$n send public key " /bin/false
done

while [ : ];do
read -p '请输入需要连接的主机: ' host
case $host in
1 | 172.16.1.5 | lb01)
ssh 172.16.1.5
;;
2 | 172.16.1.6 | lb02)
ssh 172.16.1.6
;;
3 | 172.16.1.7 | web01)
ssh 172.16.1.7
;;
4 | 172.16.1.8 | web02)
ssh 172.16.1.8
;;
5 | 172.16.1.9 | web03)
ssh 172.16.1.9
;;
6 | 172.16.1.31 | nfs)
ssh 172.16.1.31
;;
7 | 172.16.1.41 | backup)
ssh 172.16.1.41
;;
8 | 172.16.1.51 | db01)
ssh 172.16.1.51
;;
9 | 172.16.1.52 | db02)
ssh 172.16.1.52
;;
10 | 172.16.1.71 | zabbix)
ssh 172.16.1.71
;;
q )
exit
;;
*)
echo '请根据主机清单信息输入'
esac
done