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 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
29天前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
40 4
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
6天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
33 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
66 1
|
2月前
|
Shell
Shell编程(下)
Shell编程(下)
110 1
|
2月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
47 1
|
2月前
|
Shell Linux 开发工具
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
82 12
|
2月前
|
Linux iOS开发 MacOS
MacOS环境-手写操作系统-35-Shell控制台
MacOS环境-手写操作系统-35-Shell控制台
22 2