Linux操作系统实验六 Shell编程之分支程序编程

1.实验目的与要求

  1. 掌握if多分支语句的使用
  2. 掌握case语句的使用

2.实验平台

实验室安装的实验环境(Linux操作系统)和头歌(www.educoder.net)实验平台(课程实验)

3.实验内容

  1. 巩固Shell特殊字符、变量、输入输出语句
  2. 掌握if多分支语句的使用
  3. 掌握case语句的使用

4.实验详细内容、步骤

任务描述

本关任务: 掌握 if 条件判断语法及其使用方法。

相关知识
if 基本语法
  1. if [ 条件判断式 ];then
  2. 程序
  3. fi

或者

  1. if [ 条件判断式 ]
  2.   then
  3.  程序
  4. fi

注意事项: (1)[ 条件判断式 ],中括号和条件判断式之间必须有空格; (2)if 后要有空格。

if else 语法
  1. if condition
  2. then
  3.     command1
  4.     command2
  5.     ...
  6.     commandN
  7. else
  8.     command
  9. fi
条件判断运算符

我们在实际过程中,经常会遇到比较两个数值的大小,在数学中我们使用 > 号 ,比如 2>1 即可比较 2 和 1 的大小,那么在 shell 如何使用判断符号呢? 在 shell 中,我们使用 2 -gt 1来表达数学表达式中的 2>1, 这里 -gt表达的意思类似于数学运算符号中 >号。 shell 的测试符号也可以叫做运算符,分为三种类型:

  • 数值测试;
  • 字符串测试;
  • 文件测试。

【实例1】

  1. num1=100
  2. num2=100
  3. if [ $num1 -eq $num2 ];then
  4.     echo '两个数相等!'
  5. else
  6.     echo '两个数不相等!'
  7. fi

我们用 -eq 测试数值是否相等。

【实例2】判断字符串是否相等。

  1. #!/bin/bash
  2. set -x
  3. a=abc
  4. b=cba
  5. if [ ${a}y == ${b}y ]
  6. then
  7.     echo '两个字符串相等!'
  8. else
  9.     echo '两个字符串不相等!'
  10. fi

显而易见输出的结果应该是“两个字符串不相等”,这里用 == 作字符串比较运算。

思考:

  • 为什么这里判断  [ ${a}y == ${b}y ]要加个字符y了呢? 关于这一点之前教程有提过。
  • 这里的set -x 是什么意思,请大家自己翻阅资料查看?

【实例3】判断 /bin 目录下是否存在 bash 文件。

  1. cd /bin
  2. if [ -e ./bash ];then
  3.     echo '文件已存在!'
  4. else
  5.     echo '文件不存在!'
  6. fi
if else-if else 语句

在实际生产中,我们可能遇到很多条件判断,这个时候我们就需要用到 if 语句的嵌套及 if else-if else 语法, 其语法格式如下:

  1. if condition1
  2. then
  3.     command1
  4. elif condition2
  5. then
  6.     command2
  7. else
  8.     commandN

【实例4】判断两个变量是否相等:

  1. a=10
  2. b=20
  3. if [ $ay == $by ]
  4. then
  5.    echo "a 等于 b"
  6. elif [ $a -gt $b ]
  7. then
  8.    echo "a 大于 b"
  9. elif [ $a -lt $b ]
  10. then
  11.    echo "a 小于 b"
  12. else
  13.    echo "没有符合的条件"
  14. fi

输出结果:a 小于 b

编程要求

在右侧代码块按照提示,完成 Begin 和end 区间代码,实现 kubernetes 集群弹性伸缩需求,具体内容如下:

  • 判断 kubernetes 集群中当前 pod 的数量是否超过 140 个,如果超过140个,则需要 "自动增加三台集群节点";
  • 如果没有超过 140,但是超过或者等于 90 个 则需要“自动增加一台集群节点”;
  • 如果没有超过 90 个,则说明“不需要增加集群节点” 。

提示:判断一个数大于 5 并且小于 10,我们需要用到复杂运算与运算,在 shell 用 &&符号表示,使用方法参考【实例5】。 【实例5】

  1. if [ $a -gt 5 ] && [ $a -lt 10 ]; then
  2.     echo "大于5并且小于10"
  3. fi
  4. && 表示并且
  5. || 表示或者

任务描述

本关任务:带领大家学习 case in 语句的用法,掌握在 case in 语句中使用正则表达式的方法。

相关知识

Shell 支持两种分支结构(选择结构),分别是 if else 语句和 case in 语句。在上一关卡中,我们讲解了 if else 语句的用法,这关我们就来讲解 case in 语句。

case语法
  1. case expression in
  2.     pattern1)
  3.         statement1
  4.         ;;
  5.     pattern2)
  6.         statement2
  7.         ;;
  8.     pattern3)
  9.         statement3
  10.         ;;
  11.     ……
  12.     *)
  13.         statementn
  14. 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 对应的结果。

  1. #!/bin/bash
  2. num=$1    # num为脚本的第一个参数
  3. case $num in
  4.     1)
  5.         echo "Monday"
  6.         ;;
  7.     2)
  8.         echo "Tuesday"
  9.         ;;
  10.     3)
  11.         echo "Wednesday"
  12.         ;;
  13.     4)
  14.         echo "Thursday"
  15.         ;;
  16.     5)
  17.         echo "Friday"
  18.         ;;
  19.     6)
  20.         echo "Saturday"
  21.         ;;
  22.     7)
  23.         echo "Sunday"
  24.         ;;
  25.     *)
  26.         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 的内容如下:

  1. #!/bin/bash
  2. name=$1 
  3. case $name in
  4.     [a-zA-Z])
  5.         echo "字母"
  6.         ;;
  7.     [0-9])
  8.         echo "数字"
  9.         ;;
  10.     [educoder|github])
  11.         echo "very good!"
  12.         ;;
  13. esac

我们在命令行演示输出结果如下:

  1. [root@pre-host-work02 opt]# bash a.sh github
  2. very good
  3. [root@pre-host-work02 opt]# bash a.sh educoder
  4. very good
  5. [root@pre-host-work02 opt]# bash a.sh 1
  6. 数字
  7. [root@pre-host-work02 opt]# bash a.sh 2
  8. 数字
  9. [root@pre-host-work02 opt]# bash a.sh a
  10. 字母
  11. [root@pre-host-work02 opt]# bash a.sh v
  12. 字母
任务描述

本关任务:利用if else语句编写程序实现输入数字123,输出“you input is 123”;输入其他数字,输出“you input is not 123”。

相关知识

为了完成本关任务,你需要掌握:if语句的基本格式。

案例演示1

if语句的使用需要注意判断符号[]的书写要求。

  1. read -p "请回答(y/n):" answer
  2. if [ "$answer" == "y" ] || [ "$answer" == "Y" ] ; then   
  3.     echo "是"
  4. else
  5.     echo "否“
  6. 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语句的使用需要注意判断符号[]的书写要求。

  1. read -p "请回答(y/n):" answer
  2. if [ "$answer" == "y" ] || [ "$answer" == "Y" ] ; then   
  3.     echo "是"
  4. else
  5.     echo "否“
  6. fi
编程要求

根据要求,在右侧编辑器补充代码,利用if else语句编写程序实现输入Y或者y,输出“hello”,否则输出“bye”。

测试说明

平台会对你编写的代码进行测试:

测试输入:Y; 预期输出:hello

测试输入:y; 预期输出:hello

测试输入:a; 预期输出:bye

任务描述

本关任务:利用if else-if else语句编写程序实现用户输入两个数字a,b,并判断两个数字a,b的大小关系。(是相等、小于还是大于)

相关知识

为了完成本关任务,你需要掌握:if语句的基本格式。

案例演示1

if语句的使用需要注意判断符号[]的书写要求。

  1. read -p "请回答(y/n):" answer
  2. if [ "$answer" == "y" ] || [ "$answer" == "Y" ] ; then
  3.     echo "是“
  4. elif [ "$answer" == "n" ] || [ "$answer" == "N" ] ; then
  5.     echo "否“
  6. else   
  7.     echo "不知道“
  8. fi

注意大于小于等于符号的表示方法: 例如:[ "$a" -lt "$b" ]

  1.     -lt: 小于
  2.     -gt: 大于
  3.     -eq: 相等
  4.     -ne: 不相等
  5.     -le: 小于等于
  6.     -ge: 大于等于
编程要求

根据要求,在右侧编辑器补充代码,利用if else-if else语句编写程序实现用户输入两个数字a,b,并判断两个数字a,b的大小关系。(是相等、小于还是大于)

测试说明

平台会对你编写的代码进行测试:

测试输入:35; 预期输出:a小于b

测试输入:66; 预期输出:a等于b

测试输入:92; 预期输出:a大于b

任务描述

本关任务:利用case语句编写程序实现让用户输入1-4之间的数字,若输入的数字为1时,则输出“你选择了1”;若输入的数字为2时,则输出“你选择了2”;若输入的数字为3时,则输出“你选择了3”;若输入的数字为4时,则输出“你选择了4”;若输入的数字为其他字符时,则输出“你没有输入1到4之间的数字”。

相关知识

为了完成本关任务,你需要掌握:case语句的基本格式。

案例演示1
  1. case $1 in
  2.     "start")
  3.         echo "服务启动中。。。"
  4.         ;;
  5.     "")
  6.         echo "你必须提供参数,格式:{$0 参数}"
  7.         ;;
  8.     *)
  9.         echo "允许的参数是start,格式:{$0 start}"
  10.         ;;
  11. 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
  1. case $1 in
  2.     "start")
  3.         echo "服务启动中。。。"
  4.         ;;
  5.     "")
  6.         echo "你必须提供参数,格式:{$0 参数}"
  7.         ;;
  8.     *)
  9.         echo "允许的参数是start,格式:{$0 start}"
  10.         ;;
  11. esac
编程要求

根据要求,在右侧编辑器补充代码,利用case语句编写程序实现让用户输入0-100之间的成绩,若成绩小于0或者大于100,则输出“无效成绩”;若成绩区间在[80-100],则输出“A”;若成绩区间在[60-80),则输出“B”;若成绩在[0-60)之间,则输出“C”。

测试说明

平台会对你编写的代码进行测试:

测试输入:85; 预期输出:A

测试输入:72; 预期输出:B

测试输入:25; 预期输出:C

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Meteor.792

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值