[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 case  值 in 模式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 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 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 '请输入数字或者服务名: '  numif  [ $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 '请输入数字或者服务名: '  numif  [ $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/nullfor  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