Shell 脚本编程:if 条件语句

if 条件语句概述

if 条件语句是 Linux Shell 脚本编程中最基础且使用频率最高的控制结构之一,其语义类似于自然语言中的“如果…那么…”。熟练掌握 if 语句的用法,是成为一名合格运维工程师的基本要求。

if 语句基础语法

1. 单分支结构

语法格式一:
if <条件表达式>then 指令
fi
语法格式二(推荐使用):
if <条件表达式>;then指令
fi

说明:第二种语法中的分号相当于命令换行,两种语法功能完全相同,第二种更简洁。

示例:目录不存在时创建目录
if [ ! -d /tmp/furongwang ];thenmkdir /tmp/furongwang  # 如果/tmp/furongwang目录不存在,则创建该目录
fi

2. 双分支结构

语法格式:
if <条件表达式>;then指令集1
else指令集2
fi
示例:检查目录是否存在
if [ -d /tmp/furongwang ];thenecho "/tmp/furongwang is exist"  # 目录存在时输出信息
elsemkdir /tmp/furongwang  # 目录不存在时创建目录
fi

3. 多分支结构

语法格式:
if <条件表达式1>;then指令1
elif <条件表达式2>;then指令2
else指令3
fi

if 条件表达式类型

1. test 条件表达式

if test 表达式;then指令
fi

2. [ ] 条件表达式

if [ 字符串或算术表达式 ];then指令
fi

3. [[ ]] 条件表达式

if [[ 字符串或算术表达式 ]];then指令
fi

4. (( )) 条件表达式

if ((算术表达式));then指令
fi

5. 命令表达式

if 命令;then指令
fi

说明:以上表达式语法不同但功能一致,可根据个人习惯选择使用。

if 语句实践示例

示例1:检测并启动 sshd 服务

#!/bin/bash
systemctl is-active sshd &>/dev/null  # 检查sshd服务状态
if [ $? -ne 0 ];then  # 如果返回值不为0(服务未运行)echo "sshd is not running, I'll start sshd."systemctl start sshd  # 启动sshd服务
fi

示例2:检测sshd服务并输出状态信息

#!/bin/bash
systemctl is-active sshd &>/dev/null
if [ $? -ne 0 ];thenecho "sshd is not running."echo -n "Starting sshd ... ..."systemctl start sshd && echo "DONE"  # 启动成功输出DONE
elseecho "sshd is running"  # 服务已运行时输出信息
fi

示例3:通过参数控制sshd服务

#!/bin/bash
if [ "$1" == "start" ];thensystemctl start sshd
elif [ "$1" == "stop" ];thensystemctl stop sshd
elif [ "$1" == "status" ];thensystemctl status sshd
elif [ "$1" == "restart" ];thensystemctl restart sshd
elseecho "Usage: $0 start|stop|status|restart"  # 参数错误时提示用法
fi

示例4:三个整数排序

#!/bin/bash
a=10
b=20
c=30# 如果a小于b,交换值,此时a大b小
if [ $a -lt $b ];thennum=$b;b=$a;a=$num
fi# 比较后两个值大小并交换,此时c值最小
if [ $b -lt $c ];thennum=$c;c=$b;b=$num;
fi# 比较前两个值大小并交换,此时a值最大
if [ $a -lt $b ];thennum=$b;b=$a;a=$num;
fiecho "$a>$b>$c"  # 输出排序结果:30>20>10

示例5:内存监控报警

#!/bin/bash
FreeMem=$(free -m | awk 'NR==2 { print $4}')  # 获取可用内存大小
if [ $FreeMem -lt 100 ];then# 内存低于100M时发送邮件报警echo "Mem is lower than 100M" | mail -s "FreeMem is ${FreeMem}M" root@localhost
fi

计划任务配置*/3 * * * * /path/to/monitor_mem.sh

实际案例

1. 监控 MySQL 数据库服务

#!/bin/bash
if ss -lnt|grep -q ':3306';then  # 检查3306端口是否监听echo "MySQL is Running."
elseecho "MySQL is Not Running."
fi

2. 监控 Web 服务器

#!/bin/bash
if wget --timeout=10 --tries=2 www.redhat.com &>/dev/null;thenecho "Apache is Running."
elseecho "Apache is Not Running."
fi

3. 比较两个整数大小

#!/bin/bash# 判断参数个数
if [ $# -ne 2 ];thenecho "USAGE: $0 numl num2"exit 1
fi# 判断参数是否为整数
expr $1 + 1 &>/dev/null
RETVAL1=$?
expr $2 + 1 &>/dev/null
RETVAL2=$?
if [ $RETVAL1 -ne 0 -o $RETVAL2 -ne 0 ];thenecho "please provide two int number"exit 2
fi# 比较大小
if [ $1 -lt $2 ];thenecho "$1 < $2"
elif [ $1 -eq $2 ];thenecho "$1 = $2"
elseecho "$1 > $2"
fi

4. 判断字符串是否为数字

# 方法1:使用sed删除数字
[ -z "$(echo 123|sed 's/[0-9]//g')" ] && echo int || echo char# 方法2:使用变量替换
num=123
[ -n "$num" -a "$num" = "${num//[^0-9]/}" ] && echo int || echo char# 方法3:使用expr判断
expr $num + 1 &>/dev/null
[ $? -eq 0 ] && echo int || echo char# 方法4:使用正则表达式
[[ $num =~ ^[0-9]+$ ]] && echo int || echo char

5. 监控 Memcached 服务

#!/bin/bash
systemctl is-active memcached.service &>/dev/null
RetVal=$?if [ $RetVal -ne 0 ];thenecho "Memcached is not running."
else# 删除缓存中的keyprintf "del key\r\n"|nc 127.0.0.1 11211 &>/dev/null# 添加新值printf "set key 0 0 10 \r\nfurongwang1234\r\n"|nc 127.0.0.1 11211 &>/dev/null# 查询新值McCount=$(printf "get key\r\n"|nc 127.0.0.1 11211|wc -l)[ $McCount -eq 1 ] && \echo "Memcached status is ok." || \echo "Memcached status is error."
fi

6. Rsync 服务启动脚本

#!/bin/bash
# 判断参数个数
if [ $# -ne 1 ];thenecho "Usage: $0 [ start | stop | restart | status ]"exit 1
fi# 根据参数1做出相应动作
if [ "$1" = "start" ];thenrsync --daemonsleep 2# 判断当前状态if ss -lnt|grep -q ':873';thenecho "rsyncd is started."exit 0fi
elif [ "$1" = "stop" ];thenpkill rsync &>/dev/nullsleep 2# 判断当前状态if ! ss -lnt|grep -q ':873';thenecho "rsyncd is stoped."exit 0fi
elif [ "$1" = "status" ];then# 判断当前状态if ! ss -lnt|grep -q ':873';thenecho "rsyncd is stoped."elseecho "rsyncd is started."fi
elif [ "$1" = "restart" ];thenpkill rsync &>/dev/nullretval_1=$?sleep 1rsync --daemonretval_2=$?sleep 1# 判断停止和启动状态if [ $retval_1 -eq 0 -a $retval_2 -eq 0 ];thenecho "rsyncd is restarted."exit 0fi
elseecho "Usage: $0 [ start | stop | restart | status ]"exit 1
fi

执行结果:

[furongwang@shell ~]$ sudo bash /etc/init.d/rsyncd start
rsyncd is started.
[furongwang@shell ~]$ sudo bash /etc/init.d/rsyncd status
rsyncd is started.
[furongwang@shell ~]$ sudo bash /etc/init.d/rsyncd stop
rsyncd is stoped.
[furongwang@shell ~]$ sudo bash /etc/init.d/rsyncd status
rsyncd is stoped.
[furongwang@shell ~]$ sudo bash /etc/init.d/rsyncd restart
[furongwang@shell ~]$ sudo bash /etc/init.d/rsyncd status
rsyncd is started.[furongwang@shell ~]$ sudo bash /etc/init.d/rsyncd hello
Usage: /etc/init.d/rsyncd [ start | stop | restart | status ]
[furongwang@shell ~]$ echo $?
1

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

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

相关文章

浮点型的位结构和表示的值

位结构float 各部分的含义 符号位&#xff1a; 为 0 表示正数&#xff0c;为 1 表示负数。 指数部分&#xff1a; 指数部分是一个移码。指数部分有 8 位&#xff0c;首先当成无符号整型&#xff0c;则值域是 [0, 255] .因为是移码&#xff0c;所以 移码值 无符号整型值 - 127 …

39_基于深度学习的行人摔倒检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)

目录 项目介绍&#x1f3af; 功能展示&#x1f31f; 一、环境安装&#x1f386; 环境配置说明&#x1f4d8; 安装指南说明&#x1f3a5; 环境安装教学视频 &#x1f31f; 二、数据集介绍&#x1f31f; 三、系统环境&#xff08;框架/依赖库&#xff09;说明&#x1f9f1; 系统环…

【系统分析师】高分论文:论企业数据治理

【摘要】 2022年3月&#xff0c;我作为系统分析师及IT 负责人&#xff0c;参加了我司的企业级数据平台建设项目&#xff0c;该项目作为我司在企业数字化转型过程中重要的里程碑&#xff0c;在我司数字化运营中扮演着关键的角色。该项目主要包含企业级数据仓库&#xff0c;数据治…

Seata原理分析

简介Apache Seata™ (incubating) 是什么&#xff1f;Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前&#xff0c;其内部版本在阿里系内部一直扮演着应用架构层数据一致性的中间件角色&#x…

力扣 30 天 JavaScript 挑战 第38天 (第九题)学习了 语句表达式的区别 高级函数 promise async await 节流

开始答题 版本一&#xff1a; /*** param {Function} fn* return {Function}*/ var once function(fn) {let runCount0return function(...args){runCountrunCount 1 ? return fn(...args) :return undefined} };/*** let fn (a,b,c) > (a b c)* let onceFn once(fn)…

25年八月份宁德时代社招部分岗位入职Verify测评演绎数字推理SHL题型变更、题库使用说明

开始测评前&#xff0c;请注意:1、挑选一个安静的环境&#xff0c;选择一台网速正常且无任何网络端口限制的电脑进行测评;2、移动设备无法兼容远程监考功能&#xff0c;请使用配备有可正常运作的摄像头的台式机或笔记本电脑&#xff0c;建议使用最新版本的Chrome&#xff0c;Fi…

【KO】前端面试四

以下是剩余题目的详细解答,结合前端知识体系和实际应用场景展开: 91. JS 放在 head 里和放在 body 里有什么区别? 对比维度 放在 <head> 放在 <body> 加载阻塞性 会阻塞页面渲染,需等待 JS 下载/执行完成后,才继续渲染页面 一般放在 </body> 前,页面渲…

[Vid-LLM] 数据集 | 基准测试

第5章&#xff1a;数据集与基准测试 在前一章中&#xff0c;我们探讨了**视频大语言模型(Vid-LLMs)**能够执行的各种"工作"或"功能"&#xff0c;从视频总结到充当智能代理。 我们了解了它们的构建方式和扮演的角色。 但这里有个关键问题&#xff1a;这些惊…

34、扩展仓储管理系统 (跨境汽车零部件模拟) - /物流与仓储组件/extended-warehouse-management

76个工业组件库示例汇总 扩展仓储管理系统 (跨境汽车零部件模拟) 概述 这是一个高级的仓储管理系统 (WMS) 模拟组件&#xff0c;专为展示跨境汽车零部件的复杂物流场景而设计。它模拟了从海外供应商发货&#xff0c;经过海运/空运、清关、质检&#xff0c;到最终入库上架&am…

nodejs koa留言板案例开发

包含功能 登录注册(不开放注册只是用固定的账号信息) 查看列表 查看详情 发布信息 编辑信息 删除信息 项目接口 npm init -y npm install koa --save npm istall koa-router --save (旧版本) 或者 npm install koa/router --save &#xff08;新版本&#xff09; npm instal…

4+ 图论高级算法

强连通分量 基础概念 强连通&#xff1a;在有向图 GGG 中&#xff0c;如果两个点 uuu 和 vvv 是互相可达的&#xff0c;即从 uuu 出发可以到达 vvv , 从 vvv 也可以到达 uuu , 则称 uuu 和 vvv 是强连通的。如果 GGG 中任意两个点都是互相可达的&#xff0c;则称 GGG 是强连通图…

从罗永浩访谈李想中学习现代家庭教育智慧

引言 在这个信息爆炸的时代&#xff0c;每个父母都在寻找培养孩子的最佳方式。在罗永浩与理想汽车创始人李想的深度访谈中&#xff0c;我们看到了一个成功企业家童年成长的真实样本。李想的成长经历为现代家庭教育提供了许多值得深思的启示。 一、正义感与乐观精神的种子 李想回…

AI实现超级客户端打印 支持APP 网页 小程序 调用本地客户端打印

核心思路都是&#xff1a;需要一个安装在用户电脑上的“中间人”程序&#xff08;本地客户端&#xff09;来接管打印任务&#xff0c;然后通过某种通信方式命令这个客户端进行打印。下面我将分平台详细阐述各种实现思路、优缺点和适用场景。一、核心思路与公共组件&#xff1a;…

Java集合(Collection、Map、转换)

✅ 推荐使用 ❌ 已过时 1. Collection Collection 是集合框架的根接口之一&#xff0c;它是所有单列集合&#xff08;如 List、Set、Queue 等&#xff09;的公共父接口。Collection 接口定义了集合的基本操作&#xff0c;比如添加、删除、遍历等。 Collection ├── List │ …

全国网络安全知识竞赛有哪些

全国范围内有多种类型的网络安全知识竞赛&#xff0c;涵盖国家级、行业级、高校、青少年和企业等多个维度。以下是主要的网络安全知识竞赛分类及详细介绍&#xff1a;一、国家级网络安全竞赛"强网杯"全国网络安全挑战赛主办单位&#xff1a;中央网信办、河南省人民政…

系统架构设计师备考第1天——系统架构概述

一、架构本质与角色定位架构 系统的骨架 ✅ 核心作用&#xff1a; 决定系统的健壮性、生命周期、扩展性衔接需求与实现&#xff0c;保障早期质量 &#x1f468;&#x1f4bb; 架构师核心能力&#xff1a;能力维度具体要求技术掌控力精通基础技术&#xff0c;洞悉局部瓶颈决策设…

c#实现鼠标mousemove事件抽稀,避免大数据阻塞网络

这个封装类可以独立于具体的网络传输逻辑&#xff0c;为任何需要减少鼠标移动数据量的应用提供灵敏度和数据量优化。 核心优化功能 1. 灵敏度调整 // 减少微小移动的数据发送 (2, 1) 0.5 → (1, 0) // 忽略微小移动2. 移动累积 // 累积多次小移动&#xff0c;批量发送 (1, 0) …

机器学习 [白板推导](十三)[条件随机场]

​ 17. 条件随机场&#xff08;Conditional Random Field&#xff0c;CRF&#xff09; 17.1. 背景 机器学习分类模型中&#xff0c;有硬分类和软分类两种主流思想&#xff0c;其中硬分类模型有支持向量机SVM&#xff08;最大化几何间隔&#xff09;、感知机PLA&#xff08;误…

调味品生产过程优化中Ethernet/IP转ProfiNet协议下施耐德 PLC 与欧姆龙 PLC 的关键通信协同案例

案例背景在食品饮料行业&#xff0c;生产过程的精准控制对于保证产品质量和安全至关重要。某知名食品饮料企业的生产线上&#xff0c;前处理、灌装和包装环节采用了基于 ProfiNet 主站的施耐德 M340 系列 PLC 进行控制&#xff0c;以确保生产过程的稳定性和精确性。而原料仓储和…

Elasticsearch vs 单表LIKE查询性能对比

关键因素影响 1、索引结构&#xff1a; .Elasticsearch使用倒排索引&#xff0c;特别适合文本搜索 .传统数据库即使有索引&#xff0c;对LIKE %keyword%这种模式也无法有效利用 2、查询复杂度&#xff1a; .简单查询&#xff1a;ES快5-10倍 .复杂组合查询&#xff1a;ES可能快1…