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 部分。
- 如果 expression 和某个模式(比如 pattern2)匹配成功,就会执行这个模式(比如 pattern2)后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号
注意:
- 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
- 字母
任务描述
本关任务:利用if else语句编写程序实现输入数字123,输出“you input is 123”;输入其他数字,输出“you input is not 123”。
相关知识
为了完成本关任务,你需要掌握:if语句的基本格式。
案例演示1
if语句的使用需要注意判断符号[]
的书写要求。
- read -p "请回答(y/n):" answer
- if [ "$answer" == "y" ] || [ "$answer" == "Y" ] ; then
- echo "是"
- else
- echo "否“
- fi
编程要求
根据要求,在右侧编辑器补充代码,利用if else语句编写程序实现输入数字123,输出“you input is 123”;输入其他数字,输出“you input is not 123”。
测试说明
平台会对你编写的代码进行测试:
测试输入:123
; 预期输出:you input is 123
测试输入:456
; 预期输出:you input is not 123
任务描述
本关任务:利用if else语句编写程序实现输入Y或者y,输出“hello”,否则输出“bye”。
相关知识
为了完成本关任务,你需要掌握:if语句的基本格式。
案例演示1
if语句的使用需要注意判断符号[]
的书写要求。
- read -p "请回答(y/n):" answer
- if [ "$answer" == "y" ] || [ "$answer" == "Y" ] ; then
- echo "是"
- else
- echo "否“
- fi
编程要求
根据要求,在右侧编辑器补充代码,利用if else语句编写程序实现输入Y或者y,输出“hello”,否则输出“bye”。
测试说明
平台会对你编写的代码进行测试:
测试输入:Y
; 预期输出:hello
测试输入:y
; 预期输出:hello
测试输入:a
; 预期输出:bye
任务描述
本关任务:利用if else-if else语句编写程序实现用户输入两个数字a,b,并判断两个数字a,b的大小关系。(是相等、小于还是大于)
相关知识
为了完成本关任务,你需要掌握:if语句的基本格式。
案例演示1
if语句的使用需要注意判断符号[]
的书写要求。
- read -p "请回答(y/n):" answer
- if [ "$answer" == "y" ] || [ "$answer" == "Y" ] ; then
- echo "是“
- elif [ "$answer" == "n" ] || [ "$answer" == "N" ] ; then
- echo "否“
- else
- echo "不知道“
- fi
注意大于小于等于符号的表示方法: 例如:[ "$a" -lt "$b" ]
- -lt: 小于
- -gt: 大于
- -eq: 相等
- -ne: 不相等
- -le: 小于等于
- -ge: 大于等于
编程要求
根据要求,在右侧编辑器补充代码,利用if else-if else语句编写程序实现用户输入两个数字a,b,并判断两个数字a,b的大小关系。(是相等、小于还是大于)
测试说明
平台会对你编写的代码进行测试:
测试输入:3
,5
; 预期输出:a
小于b
测试输入:6
,6
; 预期输出:a
等于b
测试输入:9
,2
; 预期输出:a
大于b
任务描述
本关任务:利用case语句编写程序实现让用户输入1-4之间的数字,若输入的数字为1时,则输出“你选择了1”;若输入的数字为2时,则输出“你选择了2”;若输入的数字为3时,则输出“你选择了3”;若输入的数字为4时,则输出“你选择了4”;若输入的数字为其他字符时,则输出“你没有输入1到4之间的数字”。
相关知识
为了完成本关任务,你需要掌握:case语句的基本格式。
案例演示1
- case $1 in
- "start")
- echo "服务启动中。。。"
- ;;
- "")
- echo "你必须提供参数,格式:{$0 参数}"
- ;;
- *)
- echo "允许的参数是start,格式:{$0 start}"
- ;;
- esac
编程要求
根据要求,在右侧编辑器补充代码,利用case语句编写程序实现让用户输入1-4之间的数字,若输入的数字为1时,则输出“你选择了1”;若输入的数字为2时,则输出“你选择了2”;若输入的数字为3时,则输出“你选择了3”;若输入的数字为4时,则输出“你选择了4”;若输入的数字为其他字符时,则输出“你没有输入1到4之间的数字”。
测试说明
平台会对你编写的代码进行测试:
测试输入:1
; 预期输出:你选择了1
测试输入:3
; 预期输出:你选择了3
测试输入:9
; 预期输出:你没有输入1到4之间的数字
任务描述
本关任务:利用case语句编写程序实现让用户输入0-100之间的成绩,若成绩小于0或者大于100,则输出“无效成绩”;若成绩区间在[80-100],则输出“A”;若成绩区间在[60-80),则输出“B”;若成绩在[0-60)之间,则输出“C”。
相关知识
为了完成本关任务,你需要掌握:case语句的基本格式。
案例演示1
- case $1 in
- "start")
- echo "服务启动中。。。"
- ;;
- "")
- echo "你必须提供参数,格式:{$0 参数}"
- ;;
- *)
- echo "允许的参数是start,格式:{$0 start}"
- ;;
- esac
编程要求
根据要求,在右侧编辑器补充代码,利用case语句编写程序实现让用户输入0-100之间的成绩,若成绩小于0或者大于100,则输出“无效成绩”;若成绩区间在[80-100],则输出“A”;若成绩区间在[60-80),则输出“B”;若成绩在[0-60)之间,则输出“C”。
测试说明
平台会对你编写的代码进行测试:
测试输入:85
; 预期输出:A
测试输入:72
; 预期输出:B
测试输入:25
; 预期输出:C