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

简介: 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. 字母
相关实践学习
CentOS 8迁移Anolis OS 8
Anolis OS 8在做出差异性开发同时,在生态上和依赖管理上保持跟CentOS 8.x兼容,本文为您介绍如何通过AOMS迁移工具实现CentOS 8.x到Anolis OS 8的迁移。
目录
打赏
0
0
0
0
17
分享
相关文章
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
【Linux】冯诺依曼体系与操作系统理解
本文深入浅出地讲解了计算机体系的两大核心概念:冯诺依曼体系结构与操作系统。冯诺依曼体系作为现代计算机的基础架构,通过中央处理器、存储器和输入输出设备协同工作,解决了硬件性能瓶颈问题。操作系统则是连接硬件与用户的桥梁,管理软硬件资源,提供运行环境。文章还详细解析了操作系统的分类、意义及管理方式,并重点阐述了系统调用的作用,为学习Linux系统编程打下坚实基础。适合希望深入了解计算机原理和技术内幕的读者。
40 1
Linux 操作系统
在 Linux 中,UID(用户 ID)是标识用户身份的重要概念。UID 唯一标识每个用户,通过 UID 可区分不同用户类别:UID 0 为超级用户,1-999 为系统用户,1000 及以上为普通用户。因此,正确选项为:UID 标识用户、可区分用户类别、普通用户 UID 大于 1000。
|
1月前
|
Linux 操作系统的诞生与发展历程
步探索与准备: 1991年初,林纳斯·托瓦兹开始在一台386sx兼容微机上学习minix操作系统。通过学习,他逐渐不能满足于minix系统的现有性能,并开始酝酿开发一个新的免费操作系统。
82 8
Linux 操作系统的诞生与发展历程
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
128 6
|
3天前
|
Linux基础:文件和目录类命令分析。
总的来说,这些基础命令,像是Linux中藏匿的小矮人,每一次我们使用他们,他们就把我们的指令准确的传递给Linux,让我们的指令变为现实。所以,现在就开始你的Linux之旅,挥动你的命令之剑,探索这个充满神秘而又奇妙的世界吧!
45 19
|
18天前
|
Linux 常用文件查看命令
`cat` 命令用于连接文件并打印到标准输出,适用于快速查看和合并文本文件内容。常用示例包括:`cat file1.txt` 查看单个文件,`cat file1.txt file2.txt` 合并多个文件,`cat > filename` 创建新文件,`cat >> filename` 追加内容。`more` 和 `less` 命令用于分页查看文件,`tail` 命令则用于查看文件末尾内容,支持实时追踪日志更新,如 `tail -f file.log`。
45 5
Linux 常用文件查看命令
|
1月前
|
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
99 24
Linux系统之whereis命令的基本使用
|
24天前
|
Linux od命令
本文详细介绍了Linux中的 `od`命令,包括其基本语法、常用选项和示例。通过这些内容,你可以灵活地使用 `od`命令查看文件内容,提高分析和调试效率。确保理解每一个选项和示例的实现细节,应用到实际工作中时能有效地处理各种文件查看需求。
53 19
Linux中yum、rpm、apt-get、wget的区别,yum、rpm、apt-get常用命令,CentOS、Ubuntu中安装wget
通过本文,我们详细了解了 `yum`、`rpm`、`apt-get`和 `wget`的区别、常用命令以及在CentOS和Ubuntu中安装 `wget`的方法。`yum`和 `apt-get`是高层次的包管理器,分别用于RPM系和Debian系发行版,能够自动解决依赖问题;而 `rpm`是低层次的包管理工具,适合处理单个包;`wget`则是一个功能强大的下载工具,适用于各种下载任务。在实际使用中,根据系统类型和任务需求选择合适的工具,可以大大提高工作效率和系统管理的便利性。
158 25

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等