4. 流程控制语句

文章目录

    • 4.1 if 条件语句
      • 4.1.1 单分支
      • 4.1.2 双分支
      • 4.1.3 多分支
    • 4.2 退出程序
    • 4.3 case语句

4.1 if 条件语句

4.1.1 单分支

语法如下:

if <条件表达式>
then指令
fi或者
if <条件表达式>; then指令
fi

使用示例:判断是否已经成功挂载光盘,如果挂载则显示光盘中的文件

# 分析,判断是否拦截,我们可以判断文件的个数,而要得到文件的个数,我们需要是查询文件目录,然后过滤需要的内容,最后进行内容的切割得到最终需要的值。通过这个值来进行判断即可。[root@openEuler ~]# cat ismount.sh
#!/bin/bashnum=`/usr/bin/ls -l /mnt | grep "total" | cut -d" " -f2`if [ $num -eq 0 ] ; thenecho 'no mount'
fi      if [ $num -gt 0 ] ; then/usr/bin/ls -l  /mnt
fi

需求:编写脚本,判断当前的系统剩余内存的大小,如果小于 10M 则输出信息到日志文件中

# 分析:
# 1. 查看内存的使用情况
#    free -m
# 2. 从查看的结果中获取剩余内存的大小
#	 free -m | grep "Mem:"
# 3. 对显示的内容进行压缩,将多个空格压缩为一个空格
#    free -m|grep "Mem:"|tr -s " "
# 4. 对这个剩余内存大小进行判断,如果低于指定的值则输出信息到日志文件中
#    free -m|grep "Mem:"|tr -s " "|cut -d" " -f4[root@openEuler ~]# cat free_memory.sh
#!/bin/bashif [ $(free -m|grep "Mem:"|tr -s " "|cut -d" " -f4) -lt 3000 ] ; then/usr/bin/logger "free memory less 3000M"
fi

需求:编写脚本,判断当前脚本的执行者是否为 root 用户

# 分析:
# 判断当前登录用户有以下几种方式:
# 1. 使用 whoami 命令来得到
# 2. 使用 id -u 命令来得到当前登录用户的编号
# 3. 通过系统变量来获取 echo $USER
# 4. 通过用户编号的变量来获取 echo $UID[redhat@openEuler ~]$ cat user_info.sh 
#!/bin/bashif [ $USER != "root" ]; thenecho "please use root user operater"
fi

4.1.2 双分支

语法:

if <条件表达式1>; then指令
else指令
fi

需求:判断光盘是否挂载,如果挂载则显示挂载目录下的内容,否则执行挂载命令

[root@openEuler ~]# cat mounted.sh 
#!/bin/bashif [ $(/usr/bin/ls -l /mnt|grep "total"|cut -d" " -f2) -eq 0 ]; thenecho "mounting....."/usr/bin/mount /dev/sr0 /mnt
else/usr/bin/ls -l /mnt
fi[root@openEuler ~]# bash mounted.sh 
mounting.....
mount: /mnt: WARNING: source write-protected, mounted read-only.
[root@openEuler ~]# bash mounted.sh 
total 510
dr-xr-xr-x. 2 root root   2048 Jan  2 15:46 docs
dr-xr-xr-x. 3 root root   2048 Jan  2 15:43 EFI
dr-xr-xr-x. 3 root root   2048 Jan  2 15:43 images
dr-xr-xr-x. 2 root root   2048 Jan  2 15:43 isolinux
dr-xr-xr-x. 2 root root   2048 Jan  2 15:46 ks
dr-xr-xr-x. 2 root root 501760 Jan  2 15:46 Packages
dr-xr-xr-x. 2 root root   4096 Jan  2 15:46 repodata
-r--r--r--. 1 root root   3033 Jan  2 15:46 RPM-GPG-KEY-openEuler
-r--r--r--. 1 root root   2198 Jan  2 15:46 TRANS.TBL

需求:判断本地仓库是否创建,如果创建则显示已创建,否则这个本地仓库文件。

# 分析
# 1. 查看所有本地仓库的配置内容
#    cat /etc/yum.repos.d/*.repo
# 2. 从本地仓库的配置信息获取 baseurl 值
#    cat /etc/yum.repos.d/*.repo | grep "baseurl"
# 3. 从过滤的内容中获取最后一条
#    cat /etc/yum.repos.d/*.repo | grep "baseurl"|tail -1
# 4. 判断是否有本地仓库的配置[root@openEuler ~]# cat repos.sh 
#!/bin/bashresult=`cat /etc/yum.repos.d/*.repo | grep "baseurl"|tail -1|cut -d"=" -f2`if [ "$result" == "/mnt" ] ; thenecho "created repository"
elseecho "creating....."
/usr/bin/cat>/etc/yum.repos.d/yum.repo<<"EOF"
[baseOS]
name=baseOS
baseurl=/mnt
gpgcheck=0
EOFecho "created success"
fi

练习:判断 sshd 进程是否运行,如果服务未启动则启动相应服务。

# 分析
# 1. 查看进程
#   ps -ef | grep sshd | grep -v grep|wc -l
# 2. 查看端口
#   netstat -lntup | grep 22 | wc -l
#   ss -lntup|grep -w 22|wc -l
# 3. 查看服务
#   systemctl is-active sshd[root@openEuler ~]# cat sshd.sh 
#!/bin/bashsshd_process_count=`ps -ef|grep sshd|grep -v grep|wc -l`
sshd_port=`ss -lntup|grep -w 22|wc -l`
sshd_service=`systemctl is-active sshd`# if [ "$sshd_service" == "active" ]; thenif [ $sshd_process_count -gt 1 ]; thenecho "sshd is running....."
elseecho "sshd is not running"systemctl start sshd &> /dev/nullsleep 1echo "sshd start"
fi

练习:检查主机是否存活,并输出结果

# 分析:
# 1. 测试主机是否存活,使用 ping 命令即可。
#   ping -c3 192.168.72.150 &>/dev/null[root@openEuler ~]# cat ping.sh 
#!/bin/bashhost="192.168.72.150"
ping -c3 -W1 $host &>/dev/nullif [ $? -eq 0 ] ; thenecho "host $host is active."
elseecho "host $host is not active"
fi[root@openEuler ~]# 
[root@openEuler ~]# bash ping.sh 
host 192.168.72.150 is active.

4.1.3 多分支

语法:

if <条件表达式1>; then指令1
elif <条件表达式2>; then指令2
...
else指令n
fi

当整个 if elif 结构是不满足第一个条件进,则执行进入第二个条件表达式,如果依然不满足则进入第三个,依次类推,当都不满足时则进入 else 语句中,如果某个条件满足则执行对应的指令。

使用示例:接收两个整数并比较其大小。

# 分析:
# 1. 接收数据,我们需要使用 read 指令
# read -p "提示信息" a b
# 2. 对这两个数进行比较# 实现:
[root@openEuler ~]# cat compare.sh 
#!/bin/bashread -p "please input two number:" a bif [ $a -eq $b ]; thenecho "$a equals $b"
elif [ $a -gt $b ]; thenecho "$a greate then $b"
elif [ $a -lt $b ]; thenecho "$a less then $b"
elseecho "error"
fi[root@openEuler ~]# bash compare.sh 
please input two number:2 3
2 less then 3[root@openEuler ~]# bash compare.sh 
please input two number:5 2
5 greate then 2[root@openEuler ~]# bash compare.sh 
please input two number:5 5
5 equals 5# 实现方式二:通过执行脚本时传参,而不是通过 read 来读取
[root@openEuler ~]# cat compare2.sh 
#!/bin/bashif [ $# -ne 2 ]; thenecho "parameter must two"exit 1
fiif [ $1 -eq $2 ]; thenecho "$1 equals $2"
elif [ "$1" -gt "$2" ]; thenecho "$1 greate than $2"
elseecho "$1 less than $2"
fi[root@openEuler ~]# bash compare2.sh  4 
parameter must two
[root@openEuler ~]# bash compare2.sh
parameter must two
[root@openEuler ~]# bash compare2.sh  4  5
4 less than 5

使用示例2:根据用户的输入成绩,判断优良中差。

85-100 为优,A

70-84 为良,B

60-69 为合格,C

60以下为不合格,D

# 分析
# 1. 首先接收用户输入的数分,我们将这个分数值存入到变量 score 中
#   read -p "input score" score
# 2. 判断输入的分数是否为空
#    if [ -z $score ] ; then echo "不能为空" fi
# 3. 判断输入的分数是否小于 0 或大于 100
#    if [ $score -lt 0 -o $score -gt 100 ]; then echo "不对" fi
# 4. 判断分数是否在 85 ~ 100 之间
#    if [ $score -ge 85 -a $score -le 100 ]; then echo "A" fi
# 5. 判断分数是否在 70 ~ 84 之间
#    if [ $score -ge 70 -a $score -le 84 ]; then echo "B" fi
# 6. 判断分数是否在 60 ~ 69 之间
#    if [ $score -ge 60 -a $score -le 69 ]; then echo "C" fi
# 7. 判断分数是否在 60 以下
#    if [ $score -lt 60 ]; then echo "D" fi[root@openEuler ~]# cat score.sh 
#!/bin/bashread -p "please your score:" scoreif [ -z $score ] ; thenecho "score not empty"exit 1
elif [[ $score -lt 0 || $score -gt 100 ]] ; thenecho "score must between 0 and 100"exit 2
elif [ $score -ge 85 -a $score -le 100 ] ; thenecho "A"
elif [ $score -ge 70 -a $score -le 84 ] ; thenecho "B"
elif [[ $score -ge 60 && $score -le 69 ]] ; thenecho "C"
elseecho "D"
fi[root@openEuler ~]# bash score.sh
please your score:-1
score must between 0 and 100
[root@openEuler ~]# bash score.sh
please your score:
score not empty
[root@openEuler ~]# 
[root@openEuler ~]# bash score.sh
please your score:59
D
[root@openEuler ~]# bash score.sh
please your score:67
C
[root@openEuler ~]# bash score.sh
please your score:98
A
[root@openEuler ~]# 

说明:如果在判断语句中使用 && 或者 || 时,需要使用双中括号[[ ]]

4.2 退出程序

我们可以在 shell 中使用 exit 命令来退出脚本,并可以返回指定的状态码,以便于后续的判断。它的语法格式为:

exit status

注意:stauts 是一个数字,当值为 0 时表示命令正常结束,当为非 0 时,表示命令执行时出现了错误。

使用示例:在不同的情况下,程序返回不同一状态码。

[root@openEuler ~]# cat exit.sh 
#!/bin/bashecho hello world
echo $?hahaecho $?exit 100
[root@openEuler ~]# bash exit.sh 
hello world
0
exit.sh: line 6: haha: command not found
127
[root@openEuler ~]# echo $?
100
[root@openEuler ~]# 

exit 还可以使用在 if 语句中,使得程序在不同条件下退出

[root@openEuler ~]# cat file_create.sh 
#!/bin/bashif [ -e "$1" ]; thenecho "file $1 exists"exit 1
elseecho "file $1 is not exists"touch $1exit 0
fi	
[root@openEuler ~]# bash file_create.sh aa
file aa is not exists
[root@openEuler ~]# bash file_create.sh aa
file aa exists
[root@openEuler ~]# ll
total 28
-rw-r--r--. 1 root root   0 Mar 31 16:34 aa

4.3 case语句

语法:

case 变量名 in值1)指令1;;值2)指令2;;值n)指令n;;*)默认指令
esac

case 语句会将变量的值与每个值进行比较,如果与某个值相等,则执行该指令,当遇到“;;”符号时,表示退出 case 语句,执行后续代码。如果没有任何一个值与之匹配,则执行 “*” 后面的语句。

使用示例1:由用户从键盘输入一个字符,判断该字符是字母还是数字,以及其他字符,并输出相应的提示信息。

# 分析
# 1. 接收用户输入
# read -p "" key
# 2. 判断是否为空
#  [ -z $key ]
# 3. 判断是否为字母
# [a-z]|[A-Z]
# 4. 判断是否为数字
# [0-9]
# 5. 如果第3步和第4步都没有匹配上,则表示是其他字符[root@openEuler ~]# cat test.sh 
#!/bin/bashread -p "please input character" keyif [ -z $key ] ; thenecho "input must not empty"exit 2
fiif [ $(expr length $key) -ne 1 ] ; thenecho "input length must 1"exit 3
ficase $key in[a-z]|[A-Z])echo "input is letter";;[0-9])echo "input is number";;*)echo "input is other character";;
esac[root@openEuler ~]# bash test.sh 
please input character: c
input is letter
[root@openEuler ~]# bash test.sh 
please input character: 4
input is number
[root@openEuler ~]# bash test.sh 
please input character: ;
input is other character

使用示例2:将if语句中的多分支案例使用 case 来实现。

[root@openEuler ~]# cat score2.sh 
#!/bin/bashread -p "input your score: " scorecase ${score} in8[5-9]|9[0-9]|100)echo "A";;7[0-9]|8[0-4])echo "B";;6[0-9])echo "C";;*)echo "D"
esac[root@openEuler ~]# bash score2.sh 
input your score: 59
D
[root@openEuler ~]# bash score2.sh 
input your score: 67
C
[root@openEuler ~]# bash score2.sh 
input your score: 75
B
[root@openEuler ~]# bash score2.sh 
input your score: 89
A

练习:开发一个 rsync 起停脚本

[root@openEuler ~]# cat my_rsync.sh 
#!/bin/bashif [ "$#" -ne 1 ] ; thenecho "Usage: $0 {start|stop|restart}"exit 1
ficase "$1" in"start")/usr/bin/rsync --daemonsleep 1if [ `ss -lntup|grep rsync|wc -l` -ge 1 ] ; thenecho "rsync is start"exit 0fi;;"stop")killall rsync &>/dev/nullsleep 1if [ `ss -lntup|grep rsync|wc -l` -eq 0 ] ; thenecho "rsync is stop"exit 0fi;;"restart")if [ `ss -lntup|grep rsync|wc -l` -ge 1 ] ; thenkillall rsync &>/dev/nullsleep 1fi/usr/bin/rsync --daemonsleep 1echo "rsync is restarted"exit 0;;*)echo "Usage: $0 {start|stop|restart|"esac[root@openEuler ~]# bash my_rsync.sh 
Usage: my_rsync.sh {start|stop|restart}
[root@openEuler ~]# bash my_rsync.sh start
rsync is start
[root@openEuler ~]# bash my_rsync.sh stop
rsync is stop
[root@openEuler ~]# bash my_rsync.sh restart
rsync is restarted

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/25150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA 整合 RabbitMQ

maven pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/…

Web后端开发(请求-实体参数)(二)

简单实体对象&#xff1a;请求参数名与形参对象属性名相同&#xff0c;定义对象(POJO)接收即可 RequestMapping("/simplePojo") public String simplePojo(User user){System.out.println(user);return "OK"; } public class User{private String name;p…

算法——Floyd判圈算法

介绍 Floyd判圈算法用于判断一个链表中是否有环。 思想 使用快慢指针fast, slow&#xff0c;快指针每次走两步fast fast.next.next&#xff0c;慢指针每次走一步slow slow.next。当出现fast null || fast.next null时&#xff0c;说明链表不存在环&#xff0c;如果存在环…

1.2-自然语言的分布式表示-基于计数的方法

本篇笔记对应的视频链接为&#xff1a; 3-基于计数的方法表示单词-将文字转换成编号的预处理工作_哔哩哔哩_bilibili&#xff1b;4-基于计数的方法表示单词-使用共现矩阵进行单词的分布式表示_哔哩哔哩_bilibili&#xff1b;5-基于计数的方法表示单词-单词之间相似度计算_哔哩哔…

计算机网络 —— 网络层(CIDR)

计算机网络 —— 网络层&#xff08;CIDR&#xff09; CIDR的提出背景什么是CIDR基本概念划分示例应用优势 举个例子路由聚合常用数字 我们今天来看IPv4地址划分的另一种方法 —— CIDR。 CIDR的提出背景 CIDR&#xff08;无类域间路由&#xff0c;Classless Inter-Domain Ro…

大众汽车裁员加速,38万元遣散费起步

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 几周前&#xff0c;大众汽车宣布了一项新的裁员计划。 一、裁员行动与额外福利并行 大众汽车近期在裁员行动上取得了显著进展&#xff0c;其遣散…

深度解析:AI Prompt 提示词工程的兴起、争议与未来发展

PART1: 提示词工程的兴起 在人工智能领域中&#xff0c;一个新的领域——提示词工程&#xff08;prompt engineering&#xff09;——开始显露头角。 这个领域的核心在于精心设计输入&#xff0c;以引导AI模型产生特定的、期望的输出。 随着AI技术的飞速发展&#xff0c;特别…

Spark MLlib 机器学习

Spark MLlib是一个在Apache Spark上构建的机器学习库&#xff0c;用于解决大规模数据集上的机器学习问题。它提供了一组丰富的机器学习算法和工具&#xff0c;可以用于分类、回归、聚类、推荐和协同过滤等任务。同时&#xff0c;它还提供了一些特征提取、特征转换和特征选择的工…

无头+单向+非循环链表的实现

这里写目录标题 1. 链表1.1 链表的概念及结构1.2 链表的分类 2. 接口实现3. 链表的实现3.1 打印链表3.2 头插3.3 尾插3.4 头删3.5 尾删3.6 单链表查找3.7 在pos之前插入3.8 在pos之后插入3.9 删除pos位置的值3.10 删除pos位置之后的值3.11 链表的释放3.12 动态申请一个节点 4. …

《精通ChatGPT:从入门到大师的Prompt指南》第11章:Prompt与AI的未来

第11章&#xff1a;Prompt与AI的未来 11.1 技术发展的新方向 在迅速发展的人工智能领域&#xff0c;Prompt工程作为与AI模型交互的核心方式&#xff0c;正处于技术创新的前沿。未来几年&#xff0c;Prompt工程将沿着多个新方向发展&#xff0c;这些方向不仅会改变我们与AI互动…

Golang 高级面试题

在准备 Golang 高级面试时,通常会涉及到多种关键领域。本文将涵盖各个领域的具体问题示例和实现代码。 数据结构与算法 实现堆、链表、栈、队列、哈希表 1.最小堆: 最小堆是一种完全二叉树,树中每个节点的值都小于等于其子节点的值。常用于实现优先队列。 package main…

Spring AI 第三讲Embeddings(嵌入式) Model API 第一讲OpenAI 嵌入

Spring AI 支持 OpenAI 的文本嵌入模型。OpenAI 的文本嵌入测量文本字符串的相关性。嵌入是一个浮点数向量&#xff08;列表&#xff09;。两个向量之间的距离可以衡量它们之间的相关性。距离小表示关联度高&#xff0c;距离大表示关联度低。 先决条件 您需要与 OpenAI 创建一…

Python怎么降雪:一场编程的奇幻之旅

Python怎么降雪&#xff1a;一场编程的奇幻之旅 在编程的世界里&#xff0c;我们通常与数字、逻辑和算法打交道&#xff0c;但今天&#xff0c;让我们打破常规&#xff0c;走进一个更加奇幻的领域——使用Python来模拟降雪的场景。这不仅是一场编程的挑战&#xff0c;更是一次…

idm究竟有哪些优势

IDM&#xff0c;即Internet Download Manager&#xff0c;是一款功能强大的下载管理软件&#xff0c;具有许多优势。以下是IDM的主要优势&#xff1a; 加快下载速度&#xff1a;IDM采用多线程技术下载文件&#xff0c;能够同时分割文件并使用多个连接下载&#xff0c;从而大大提…

【Linux】rsync远程数据同步工具使用

一、rsync工具介绍 rsync是一个用于在本地或远程系统之间同步文件和目录的工具。它通过比较源和目标文件的元数据&#xff08;例如修改时间和大小&#xff09;来确定需要同步的内容&#xff0c;然后仅传输必要的数据进行更新&#xff0c;从而实现高效的同步操作。 rsync有如下特…

Transformer学习之SwinTransformer

1.算法简介 本文主要参考自以下链接&#xff0c;整理成线上的形式用于备忘&#xff0c;排版太麻烦了直接贴图&#xff0c;参考的朋友慎重&#xff0c;不如直接看参考链接&#xff0c;后期有了新的理解继续更正。 参考链接1&#xff1a;Swin-Transformer网络结构详解_swin tran…

程序员如何转行成为一个漫画自媒体-连载2

仿写关于如何撰写文案的内容如下&#xff1a; 如何编写文案&#xff1f; 从零开始自己创作显然效率过低&#xff0c;初期阶段还是需要从其他漫画公众号中学习技巧&#xff0c;然而只能看到最终成品&#xff0c;却无法获得他们的实际文案。 不过&#xff0c;通过广泛的阅读&…

【文件导出2】导出html文件数据

导出html文件数据 文章目录 导出html文件数据前言一、实现代码1.controller层2.接口层3.接口实现类4.FileUtil 工具类 二、文件导出效果总结 前言 springBoot项目实现在线导出html文件数据的功能。 一、实现代码 1.controller层 GetMapping("/record/_export") Ap…

.NET4.8安装失败解决办法

在windows 2008 r2 安装.net 4.8 &#xff0c;一开始下载 .net 4.8 的web 安装包&#xff0c;链接如下&#xff1a; https://download.visualstudio.microsoft.com/download/pr/2d6bb6b2-226a-4baa-bdec-798822606ff1/9b7b8746971ed51a1770ae4293618187/ndp48-web.exe 安装过…

Flutter中同步与异步

一&#xff0c;同步/异步的理解 1&#xff0c;await&#xff1a;同步机制 同步操作会阻止其他操作执行&#xff0c;直到完成为止。同步就好比打电话一样&#xff0c;打电话时都是一个人在说另一个人听&#xff0c;一个人在说的时候另一个人等待&#xff0c;等另一个人说完后再…