1.实验目的与要求
- 掌握if多分支语句的使用
- 掌握case语句的使用
2.实验平台
实验室安装的实验环境(Linux操作系统)和头歌(www.educoder.net)实验平台(课程实验)
3.实验内容
- 巩固Shell特殊字符、变量、输入输出语句
- 掌握if多分支语句的使用
- 掌握case语句的使用
4.实验详细内容、步骤
任务描述
本关任务: 掌握 if 条件判断语法及其使用方法。
相关知识
if 基本语法
- if[条件判断式];then
- 程序
- fi
或者
- if[条件判断式]
- then
- 程序
- fi
注意事项: (1)[ 条件判断式 ],中括号和条件判断式之间必须有空格; (2)if 后要有空格。
if else 语法
- if condition
- then
- command1
- command2
- ...
- commandN
- else
- command
- fi
条件判断运算符
我们在实际过程中,经常会遇到比较两个数值的大小,在数学中我们使用 >号 ,比如 2>1即可比较 2 和 1 的大小,那么在 shell 如何使用判断符号呢? 在 shell 中,我们使用 2 -gt 1
来表达数学表达式中的 2>1, 这里 -gt
表达的意思类似于数学运算符号中 >
号。 shell 的测试符号也可以叫做运算符,分为三种类型:
- 数值测试;
- 字符串测试;
- 文件测试。
【实例1】
- num1=100
- num2=100
- if[ $num1 -eq $num2 ];then
- echo '两个数相等!'
- else
- echo '两个数不相等!'
- fi
我们用 -eq
测试数值是否相等。
【实例2】判断字符串是否相等。
- #!/bin/bash
- set-x
- a=abc
- b=cba
- if[ ${a}y == ${b}y ]
- then
- echo '两个字符串相等!'
- else
- echo '两个字符串不相等!'
- fi
显而易见输出的结果应该是“两个字符串不相等”,这里用 ==
作字符串比较运算。
思考:
- 为什么这里判断
[ ${a}y == ${b}y ]
要加个字符y
了呢? 关于这一点之前教程有提过。 - 这里的
set -x
是什么意思,请大家自己翻阅资料查看?
【实例3】判断 /bin
目录下是否存在 bash 文件。
- cd /bin
- if[-e ./bash ];then
- echo '文件已存在!'
- else
- echo '文件不存在!'
- fi
if else-if else 语句
在实际生产中,我们可能遇到很多条件判断,这个时候我们就需要用到 if 语句的嵌套及 if else-if else 语法, 其语法格式如下:
- if condition1
- then
- command1
- elif condition2
- then
- command2
- else
- commandN
【实例4】判断两个变量是否相等:
- a=10
- b=20
- if[ $ay == $by ]
- then
- echo "a 等于 b"
- elif[ $a -gt $b ]
- then
- echo "a 大于 b"
- elif[ $a -lt $b ]
- then
- echo "a 小于 b"
- else
- echo "没有符合的条件"
- fi
输出结果:a
小于 b
。
编程要求
在右侧代码块按照提示,完成 Begin 和end 区间代码,实现 kubernetes 集群弹性伸缩需求,具体内容如下:
- 判断 kubernetes 集群中当前 pod 的数量是否超过 140 个,如果超过140个,则需要 "自动增加三台集群节点";
- 如果没有超过 140,但是超过或者等于 90 个 则需要“自动增加一台集群节点”;
- 如果没有超过 90 个,则说明“不需要增加集群节点” 。
提示:判断一个数大于 5 并且小于 10,我们需要用到复杂运算与运算
,在 shell 用 &&
符号表示,使用方法参考【实例5】。 【实例5】
- if[ $a -gt 5]&&[ $a -lt 10];then
- echo "大于5并且小于10"
- fi
- &&表示并且
- ||表示或者
任务描述
本关任务:带领大家学习 case in 语句的用法,掌握在 case in 语句中使用正则表达式的方法。
相关知识
Shell 支持两种分支结构(选择结构),分别是 if else 语句和 case in 语句。在上一关卡中,我们讲解了 if else 语句的用法,这关我们就来讲解 case in 语句。
case语法
- case expression in
- pattern1)
- statement1
- ;;
- pattern2)
- statement2
- ;;
- pattern3)
- statement3
- ;;
- ……
- *)
- statementn
- esac
语法说明:
- case、in 和 esac 都是 Shell 关键字,expression 表示表达式,pattern 表示匹配模式;
- expression 既可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以;
- pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。
- case 会将 expression 的值与 pattern1、pattern2、pattern3 逐个进行匹配:
- 如果 expression 和某个模式(比如 pattern2)匹配成功,就会执行这个模式(比如 pattern2)后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号
;;
才停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句。 - 如果 expression 没有匹配到任何一个模式,那么就执行
*)
后面的语句(*
表示其它所有值),直到遇见双分号;;
或者 esac 才结束。*)
相当于多个 if 分支语句中最后的 else 部分。
注意:
- case in 语句中的
*)
用来“托底”,万一 expression 没有匹配到任何一个模式,*)
部分可以做一些“善后”工作,或者给用户一些提示; - 可以没有
*)
部分,如果 expression 没有匹配到任何一个模式,那么就不执行任何操作。
说了这么多,可能有点云里雾里,不如让我来根据【实例1】感受一下什么是case in
语句:
【实例1】根据脚本传递的第一个参数,来 echo 对应的结果。
- #!/bin/bash
- num=$1 # num为脚本的第一个参数
- case $num in
- 1)
- echo "Monday"
- ;;
- 2)
- echo "Tuesday"
- ;;
- 3)
- echo "Wednesday"
- ;;
- 4)
- echo "Thursday"
- ;;
- 5)
- echo "Friday"
- ;;
- 6)
- echo "Saturday"
- ;;
- 7)
- echo "Sunday"
- ;;
- *)
- echo "error"
输出结果:
- 当 $1=1 的时候,即匹配到 case 为 1 的条件,这时输出的结果为 Monday;
- 当 $1=2 的时候,按顺序匹配,先匹配 pattern1 即数值为 1,发现不匹配;继续匹配 pattern 2,发现匹配到 case 为 2 的条件,这时输出的结果为Tuesday;
- 以此类推,当 $1 为 3,4,5,6,7 的时候,会从上至下顺序匹配,根据匹配的条件执行对应的表达式,即输出对应的值;
- 当 $1 不为 1 2 3 4 5 6 7 的时候,这时会“兜底”匹配
*)
,执行“兜底”的语句。
case和正则表达式
case in 的 pattern 部分支持简单的正则表达式,具体来说,可以使用以下几种格式:
说明:
- 如果不加以说明,Shell 的值都是字符串,expression 和 pattern 也是按照字符串的方式来匹配的;【实例1】看起来是判断数字是否相等,其实是判断字符串是否相等;
- 最后一个分支
*)
并不是什么语法规定,它只是一个正则表达式,*
表示任意字符串,所以不管 expression 的值是什么,*)
总能匹配成功。
【实例2】:本实例演示 case in 语句中如何正则表达式。 已知脚本 a.sh 的内容如下:
- #!/bin/bash
- name=$1
- case $name in
- [a-zA-Z])
- echo "字母"
- ;;
- [0-9])
- echo "数字"
- ;;
- [educoder|github])
- echo "very good!"
- ;;
- esac
我们在命令行演示输出结果如下:
- [root@pre-host-work02 opt]# bash a.sh github
- very good!
- [root@pre-host-work02 opt]# bash a.sh educoder
- very good!
- [root@pre-host-work02 opt]# bash a.sh 1
- 数字
- [root@pre-host-work02 opt]# bash a.sh 2
- 数字
- [root@pre-host-work02 opt]# bash a.sh a
- 字母
- [root@pre-host-work02 opt]# bash a.sh v
- 字母