[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