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. 字母
目录
相关文章
|
4天前
|
存储 缓存 安全
【Linux】冯诺依曼体系结构与操作系统及其进程
【Linux】冯诺依曼体系结构与操作系统及其进程
42 1
|
4天前
|
缓存 监控 关系型数据库
深入理解Linux操作系统的内存管理机制
【7月更文挑战第11天】在数字时代的浪潮中,Linux操作系统凭借其强大的功能和灵活性,成为了服务器、云计算以及嵌入式系统等领域的首选平台。内存管理作为操作系统的核心组成部分,对于系统的性能和稳定性有着至关重要的影响。本文将深入探讨Linux内存管理的基本原理、关键技术以及性能优化策略,旨在为读者提供一个全面而深入的理解视角,帮助开发者和系统管理员更好地优化和管理Linux系统。
|
4天前
|
弹性计算 运维 Linux
基于在Alibaba Cloud Linux 3 的OS Copilot 产品评测
作为一名技术运维的工作者,每天做的最多一件事就是在Linux下敲各种各样的命令,或完成功能性的部署,或检查系统的稳定性。如果 OS Copilot 作为我的日常工具,我使用场景会更集中于快捷命令或脚本的实现,智能帮我生成各类功能脚本,为我提高运维效率。
基于在Alibaba Cloud Linux 3 的OS Copilot 产品评测
|
5天前
|
人工智能 运维 自然语言处理
当Linux遇上AI:探索操作系统中的智能新纪元
阿里云的OS Copilot是专为Linux打造的智能助手,利用大模型提供自然语言交互、命令辅助及运维优化。它简化编程任务,生成脚本框架,提供代码审查建议,适合开发者和运维人员。
44 0
当Linux遇上AI:探索操作系统中的智能新纪元
|
6天前
|
弹性计算 运维 安全
【实践】使用操作系统智能助手OS Copilot解锁操作系统运维与编程
体验阿里云OS Copilot,运维人员进行Linux环境配置,包括初始化、修改密码和设置端口。工具提供知识问答、辅助编程功能,能理解口语化指令,但对复杂编程任务有限制。作为运维,给予产品8分,愿意推荐并参与开源开发。产品优点在于准确度,期待扩展更多语言支持和智能故障排查。不足之处包括资源续费说明不清、特定问题回答不准确和需实时学习更新。
|
7天前
|
弹性计算 运维 Linux
阿里云Linux os copilot 运维助手初体验
摘要(Markdown格式): 在阿里云ECS上体验了Linux编程助手OS Copilot,步骤包括申请账户、开通ECS、安装Copilot。Copilot准确解释代码、快速响应问答、辅助编程,尤其在代码生成和注解上表现出色。作为运维人员,认为其简化了工作,给出8分评价,并愿意推荐给他人。期望它能支持更多操作系统,优化代码直接运行功能,并与更多阿里云产品集成。目前只体验了Copilot的基础功能,未与其他类似产品对比。
|
4天前
|
Java Shell Linux
【Linux】手把手教你做一个简易shell(命令行解释器)
【Linux】手把手教你做一个简易shell(命令行解释器)
7 0
|
4天前
|
JavaScript 前端开发 Shell
Shell 脚本编程保姆级教程(上)
Shell 脚本编程保姆级教程(上)
|
4天前
|
网络协议 Shell Linux
Shell脚本配置Centos静态ip地址
这是一个用于在CentOS上设置静态IP的Shell脚本摘要: - 脚本交互式获取用户输入的IP地址、子网掩码、网关和DNS。 - 使用`sed`命令动态更新`/etc/sysconfig/network-scripts/ifcfg-ENS33`配置文件。 - 修改`BOOTPROTO`为`static`,并设置IP、NETMASK、GATEWAY和DNS1字段。 - 用`systemctl restart network`重启网络服务。 - 提示用户新配置的静态IP信息。
|
10天前
|
Shell Linux
Linux Shell 脚本入门教程:开启你的自动化之旅
Shell是一种计算机程序,它充当了用户与操作系统之间的接口。在Linux系统中,Shell允许用户通过命令行界面(CLI)来控制计算机。Shell脚本则是一种使用Shell语言编写的脚本,它可以自动执行一系列的命令,帮助用户实现任务自动化,提高工作效率。