小阿轩yx-Shell编程之条件语句
小阿轩yx-Shell编程之条件语句
条件测试操作
Shell 环境根据命令执行后的返回状态值($?)来判断是否执行成功
返回值
- 为 0 时:表示成功
- 否则(非 0 值)表示失败或异常
测试工具 test 命令,对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为 0 表示条件成立)。
test 测试命令包括以下两种形式
# 至少应有一个空格
格式1:test 条件表达式
格式2:[ 条件表达式 ]
- test 条件表达式
- [ 条件表达式 ]
(注:两种方式的作用完全相同,但通常后一种形式更为常用,也更贴近编程习惯)需要注意方括号“[”或“]”与条件表达式之间需要至少一个空格进行分隔
测试条件类别不同,条件表达式也不同
常用的条件操作包括
- 文件测试
- 整数值比较
- 字符串比较
- 以及针对多个条件的逻辑测试
文件测试
[ 操作符 文件或目录 ]
[root@localhost ~]# [ -d /media/cdrom ]
[root@localhost ~]# echo $?
0
# 返回0表示条件成立
[root@localhost ~]# [ -d /media/cdrom/Server ]
[root@localhost ~]# echo $?
0
# 返回1表示条件成立
[root@localhost ~]# [ -d /media/cdrom/Server ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -d /media/cdrom ] && echo "YES" # 无输出表示不存在
[root@localhost ~]# [ -d /media/cdrom ] && echo "YES"
YES
根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、可写、可执行
文件测试的常见操作选项
- -d:测试是否为目录(Directory)
- -e:测试目录或文件是否存在(Exist)
- -f:测试是否为文件(File)
- -r:测试当前用户是否有权限读取(Read)
- -w:测试当前用户是否有权限写入(Write)
- -x:测试是否设置有可执行(Excute)权限
整数值比较
[ 整数1 操作符 整数2 ]
[root@localhost ~]# unum=`who | wc -l`
[root@localhost ~]# [ $unum -gt 5 ] && echo "Too many"
[root@localhost ~]# [ $unum -gt 0 ] && echo "Too many"
Too many\\ 可用内存空间
[root@localhost ~]# freecc=$(free -m | grep "Mem" | awk '{print $4+$6}')
\\ 小于某值后输出具体的值1269MB
[root@localhost ~]# [ $freecc -lt 2048 ] && echo ${freecc}MB
根据给定的两个整数值,判断第一个数与第二个数的关系,如是否大于、等于、小于第二个数
(注:整数值比较在 Shell 脚本编写中的应用较多)
- -eq:第一个数等于(Equal)第二个数
- -ne:第一个数不等于(Not Equal)第二个数
- -gt:第一个数大于(Greater Than)第二个数
- -lt:第一个数小于(Lesser Than)第二个数
- -le:第一个数小于或等于(Lesser or Equal)第二个数
- -ge:第一个数大于或等于(Greater or Equal)第二个数
注:[ 选项 ]:中括号前后要有空格
字符串比较
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
[ -z 字符串 ]
\\ 当前的语言环境
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
\\ 字符串比较测试 !=前后有空格
[root@localhost ~]# [ LANG != "en.US" ] && echo "not en.US"
not en.US[root@localhost ~]# read -p "是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?yes
[root@localhost ~]# [ $ACK = "yes" ] && echo "覆盖"
覆盖
[root@localhost ~]# read -p "是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?no
[root@localhost ~]# [ $ACK = "no" ] && echo "不覆盖"
不覆盖
通常用在
- 检查用户输入
- 系统环境等是否满足条件
在交互式操作Shell 脚本中,也可用来判断用户输入的位置参数是否符合要求
常用操作选项
- =:第一个字符串与第二个字符串相同
- !=:第一个字符串与第二个字符串不相同,其中“!”符号表示取反
- -z:检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串
逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ...
[root@localhost ~]# uname -r
2.6.32-431.el6.x86_64
[root@localhost ~]# Mnum=$(uname -r | awk -F. '{print $1}')
[root@localhost ~]# Snum=$(uname -r | awk -F. '{print $2}')
[root@localhost ~]# [ $Mnum -eq 2 ] && [ $Snum -gt 4 ] && echo "符合要求"
符合要求
- 判断两个或多个条件之间的依赖关系
- 使用时放在不同的测试语句或命令之间
常用的逻辑测试操作
- &&:逻辑与,表示“而且”,只有当前后两个条件都成立时,整个测试命令的返回值才为 0(结果成立)。使用 test 命令测试时,“&&”可改为“-a”
- ||:逻辑或,表示“或者”,只要前后两个条件中有一个成立,整个测试命令的返回值即为 0(结果成立)。使用 test 命令测试时,“||”可改为“-o”
- !:逻辑否,表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为 0(结果成立)
(注:“&&”和“||”通常也用于间隔不同的命令操作,作用是相似的)
if 条件语句
使用专用的 if 条件语句好处
- 可以更好地整理脚本结构
- 使得层次分明
- 清晰易懂
if 语句的结构
- 是最为常用的一种流程控制方式
- 根据特定的条件测试结果
- 分别执行不同的操作(如果……那么……)。根据不同的复杂程度
三种基本类型
- 单分支 if 语句:指的是不同测试结果所对应的执行语句(一条或多条)。对于单分支的选择结构,只有在“条件成立”时才会执行相应的代码,否则不执行任何操作
- 双分支 if 语句:要求针对“条件成立”“条件不成立”两种情况分别执行不同的操作
- 多分支 if 语句:可以根据测试结果的成立、不成立分别执行操作,所以能够嵌套使用,进行多次判断
if 语句应用示例
- 单分支 if 语句应用:只判断一个成立或者不成立的条件
- 双分支 if 语句应用:只是在单分支的基础上针对“条件不成立”的情况执行另一种操作,而不是“坐视不管”地不执行任何操作
- 多分支 if 语句应用:能够根据多个互斥的条件分别执行不同的操作,实际上等同于嵌套使用的 if 语句
单分支结构
\\ 编辑配置文件
[root@localhost ~]# vim chkmountdir.sh
\\ 判断挂载点目录,若不存在则自动创建
MOUNT_DIR="/media/cdrom/"
#!/bin/bash
if 条件测试操作then 命令序列
fi
if 已用磁盘空间>80%then 报警
fi
\\ 添加执行权限
[root@localhost ~]# chmod +x chkmountdir.sh
\\ 判断挂载点是否存在
[root@localhost ~]# ./chkmountdir.sh
双分支结构
if 条件测试操作then 命令序列1else 命令序列2
fi
if 80端口是否在监听then 网站服务已在运行else 启动httpd服务
fi
- 判断目标主机是否存活,显示检测结果
[root@localhost ~]# vim pinghost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
if [ $? -eq 0 ]thenecho "Host $1 is up." elseecho "Host $1 is down."
fi
\\ 添加执行权限
[root@localhost ~]# chmod +x pinghost.sh
多分支结构
if 条件测试操作1then 命令序列1
elif 条件测试操作2 then 命令序列2
else命令序列3
fi
if 分数为85~100之间then 判为优秀
elif 分数为70~84之间then 判为合格
esle判为不合格
fi
- 判断分数范围,分出优秀、合格、不合格三档
[root@localhost ~]# vim gradediv.sh
#!/bin/bash
read -p "请输入您的分数(0-100): " GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]thenecho "$GRADE 分,优秀!"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]thenecho "$GRADE 分,合格!"
elseecho "$GRADE 分,不合格!"
fi
\\ 添加执行权限
[root@localhost ~]# chmod +x gradediv.sh
case 分支语句
优点
- 使脚本程序结构更加清晰
- 层次分明
case 语句的结构
适用于以下情况
- 某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的 if 语句非常相似,只不过 if 语句需要判断多个不同的条件,而 case 语句只是判断一个变量的不同取值
- 关键字 case 后面跟的是“变量值”,即“$变量名”
使用 case 分支语句值得注意的特点
- case 行尾必须为单词“in”,每一模式必须以右括号“)”结束
- 双分号“;;”表示命令序列的结束
- 模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号
- “|”表示或,如“A|B”
- 最后的“*)”表示默认模式,其中的*相当于通配符
case 语句应用示例
case 变量值 in
模式1)命令序列1;;
模式2)命令序列2;;……
* )默认命令序列
esac
case 分数 in
85~100)判为优秀;;
70~84)判为合格;;......
*)判为不合格
esac
[root@localhost ~]# vim hitkey.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in[a-z]|[A-Z])echo "您输入的是 字母.";;[0-9])echo "您输入的是 数字.";;*)echo "您输入的是 空格、功能键或者其他控制字符."
esac
添加权限
[root@localhost ~]# chmod a+x hitkey.sh
测试并确认结果
[root@localhost ~]#./hitkey.sh
请输入一个字符,并按Enter键:k
您输入的是 字母 k.
......
检查用户输入的字符类型
- 提示用户从键盘输入一个字符
- 通过 case 语句判断该字符是否为字母、数字或者其他控制字符
- 给出相应的提示信息
编写系统服务脚本
[root@localhost ~]# vim myprog
#!/bin/bash
case "$1" in
start)echo -n "正在启动 sleep 服务 ... "
if sleep 7200 &\\ 在后台启动 sleep 进程thenecho "OK"
fi
;;stop)echo -n "正在停止 sleep 服务 ... "pkill "sleep" &> /dev/null// 停止 sleep 进程echo "OK"
;;status)
if pgrep "sleep" &>/dev/null ;
//判断并提示 sleep 进程状态then echo "sleep 服务已经启动." elseecho "sleep 服务已经停止."
fi
;;restart)
\\ 先停止
$0 stop
\\ 再启动服务
$0 start
\\ 默认显示用法信息
;; *)echo "用法: $0 {start|stop|status|restart}"
esac
添加权限
[root@localhost ~]# chmod +x myprog
[root@localhost ~]# ./myprog start
正在启动 sleep 服务 ... OK
[root@localhost ~]# ./myprog status
sleep 服务已经启动.
[root@localhost ~]# ./myprog stop
正在停止 sleep 服务 ... OK
//未提供此参数,按默认处理
[root@localhost ~]# ./myprog reload
用法: ./myprog {start|stop|status|restart}
[root@localhost ~]# cp myprog /etc/init.d/
[root@localhost ~]# chkconfig --add myprog
[root@localhost ~]# chkconfig --list myprog
[root@localhost ~]# service myprog start
注
- # chkconfig: 35 80 20:运行级别
- # chkconfig: - 80 20:数字越大,优先启动
小阿轩yx-Shell编程之条件语句
相关文章:
小阿轩yx-Shell编程之条件语句
小阿轩yx-Shell编程之条件语句 条件测试操作 Shell 环境根据命令执行后的返回状态值($?)来判断是否执行成功 返回值 为 0 时:表示成功否则(非 0 值)表示失败或异常 测试工具 test 命令,对特定条件进行…...
MyBatis-Plus 从入门到精通
MyBatis-Plus 从入门到精通 前言快速入门创建一个SpringBoot项目导入依赖配置数据库创建一个实体类创建一个mapper接口在SpringBoot启动类上配置mapper接口的扫描路径在数据库中创建表编写一个SpringBoot测试类 核心功能注解CRUD接口Mapper CRUD接口Service CRUD 接口条件构造器…...
爬虫利器Frida RPC入门——夜神模拟器环境篇
Frida是一款轻量级HOOK框架,可用于多平台上,例如android、windows、ios等。 frida分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行在系统机器上。frida上层接口支持js、python、…...
猫狗分类识别模型建立①数据标记
一、labelImg库说明 LabelImg是一款非常流行的图像标注工具,广泛用于机器学习和计算机视觉领域。以下是关于LabelImg的详细介绍: 主要功能和特点 1.图像标注 允许用户在图像中标注物体,选择特定区域,并为这些区域添加标签或类…...
FME学习之旅---day28
我们付出一些成本,时间的或者其他,最终总能收获一些什么。 教程:CSV 入门...
vue3项目中字典和全局方法的创建与使用
在src下新建dict.ts/js,写入下面代码 import { App, Plugin } from vue;interface Dict {auditgrouptypeList: { label: string; value: string }[];auditstateList: { label: string; value: string }[];accountchangeList: { label: string; value: number }[]; }const Dict…...
51-54 Sora能制作动作大片还需要一段时间 | DrivingGaussian:周围动态自动驾驶场景的复合高斯飞溅
24年3月,北大、谷歌和加州大学共同发布了DrivingGaussian: Composite Gaussian Splatting for Surrounding Dynamic Autonomous Driving Scenes。视图合成和可控模拟可以生成自动驾驶的极端场景Corner Case,这些安全关键情况有助于以更低成本验证和增强自…...
数据挖掘实战-基于余弦相似度的印度美食推荐系统
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
深入探索DreamFusion:文本到3D生成的革命性技术
深入探索DreamFusion:文本到3D生成的革命性技术 引言: 在人工智能和计算机视觉领域,DreamFusion无疑是一个引人注目的新星。这项技术,基于Google提出的深度学习模型,将自然语言与三维内容生成紧密结合,开…...
JSP期末要点复习
一、JSP工作原理 1.客户端请求JSP页面:用户通过浏览器发送一个请求到服务器,请求一个特定的JSP页面。这个请求被服务器上的Web容器(如Apache Tomcat)接收。 2.JSP转换为Servlet:当JSP页面第一次被请求时࿰…...
AJAX(JavaScript版本)
目录 一.AJAX简介 二.XMLHttpRequests对象 2.1XMLHttpRequests对象简介 2.2创建XMLHttpRequests对象 2.3定义回调函数 2.4发送请求 2.5XMLHttpRequests对象方法介绍 2.6XMLHttpRequests对象属性 三.向服务器发送请求 3.1发送请求 3.2使用GET还是POST 3.3使用GET来发…...
框架学习之SpringMVC学习笔记(一)
一、SpringMVC简介 1-介绍 Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc ),但它通常被称为“Spring MVC”。 在控制层…...
数据集005:螺丝螺母目标检测数据集(含数据集下载链接)
数据集简介 背景干净的目标检测数据集。 里面仅仅包含螺丝和螺母两种类别的目标,背景为干净的培养皿。图片数量约420张,train.txt 文件描述每个图片中的目标,label_list 文件描述类别 另附一个验证集合,有10张图片,e…...
Swift 类和结构体
类和结构体 一、结构体和类对比1、类型定义的语法2、结构体和类的实例3、属性访问4、结构体类型的成员逐一构造器 二、结构体和枚举是值类型三、类是引用类型1、恒等运算符2、指针 结构体和类作为一种通用而又灵活的结构,成为了人们构建代码的基础。你可以使用定义常…...
网络安全相关面试题(hw)
网络安全面试题 报错注入有哪些函数 updatexml注入 载荷注入 insert注入 updata注入 delete注入 extractvalue()注入 注入防御方法 涵数过滤 直接下载相关防范注入文件,通过incloud包含放在网站配置文件里面 PDO预处理,从PHP 5.1开始&…...
前端开发攻略---三种方法解决Vue3图片动态引入问题
目录 1、将图片放入public文件夹中 2、使用 /src/.... 路径开头 3、生成图片的完整URL地址(推荐) 1、将图片放入public文件夹中 使用图片:路径为 /public 开头 <template><div><img :src"/public/${flag ? 01 : 02}.jp…...
零售EDI:Target DVS EDI项目案例
Target塔吉特是美国一家巨型折扣零售百货集团,与全球供应商建立长远深入的合作关系,目前国内越来越多的零售产品供应商计划入驻Target。完成入驻资格审查之后,Target会向供应商提出EDI对接邀请,企业需要根据指示完成供应商EDI信息…...
AWS安全性身份和合规性之AWS Firewall Manager
AWS Firewall Manager是一项安全管理服务,可让您在AWS Organizations中跨账户和应用程序集中配置和管理防火墙规则。在创建新应用程序时,您可以借助Firewall Manager实施一套通用的安全规则,更轻松地让新应用程序和资源从一开始就达到合规要求…...
R实验 随机变量及其分布
实验目的: 掌握常见几种离散性随机变量及其分布在R语言中对应的函数用法;掌握常见几种连续性随机变量及其分布在R语言中对应的函数用法;掌握统计量的定义及统计三大抽样分布在R语言中对应的函数用法。 实验内容: (习题…...
rapidssl泛域名https600元一年
泛域名https证书也可以称之为通配符https证书,指的是可以用一张https证书为多个网站(主域名以及主域名下的所有子域名网站)传输数据加密,并且提供身份认证服务的数字证书产品。RapidSSL旗下的泛域名https证书性价比高,申请速度快,…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
