7. if 条件语句的知识与实践

7. if 条件语句的知识与实践

7.1 if 条件语句

if条件语句是Linux运维人员在实际工作中最常用也是最重要的语句,就像我们日常生活中的"如果...那么..."判断一样简单直观。让我们一起来掌握这个强大的工具吧!

7.1.1 if 条件语句的语法

1. 单分支结构

第一种语法:清晰明了

bash

复制代码
if <条件表达式>
  then 
  指令
fi

第二种语法:简洁紧凑

bash

复制代码
if <条件表达式>;then
  指令
fi

这里的<条件表达式>可以是test、\[\]、\[]、(())等条件表达式,甚至可以直接使用命令。每个if语句都以if开头,带有then,最后以fi结束。

小提示:第二种语法中的分号相当于换行符,两种语法效果相同,选择你喜欢的即可。

记忆技巧:想象女孩对男孩说:

bash

复制代码
如果 你有房;那么
  我就嫁给你
果如

if单分支语句执行流程如下:

实用示例:检查并创建目录

bash

复制代码
#!/bin/bash
# 检查/tmp/laoma目录是否存在,如果不存在则创建
if [ ! -d /tmp/laoma ];then
  mkdir /tmp/laoma
  echo "目录已创建"
fi
2. 双分支结构

双分支结构就是:"如果...,那么...,否则..."

bash

复制代码
if <条件表达式>;then
  指令集1
else
  指令集2
fi

if双分支语句执行流程:

记忆技巧:女孩对男孩说:

bash

复制代码
如果 你有房;那么
  我就嫁给你
否则
  我再考虑考虑
果如

实用示例:检查SSH服务状态

bash

复制代码
#!/bin/bash
# 检查sshd服务是否运行
if systemctl is-active sshd &>/dev/null;then
  echo "SSH服务正在运行"
else
  echo "SSH服务未运行,正在启动..."
  systemctl start sshd
fi
3. 多分支结构

多分支结构允许更复杂的条件判断:

bash

复制代码
if <条件表达式1>;then
  指令1
elif <条件表达式2>;then
  指令2
else
  指令3
fi

if多分支语句执行流程:

记忆技巧:女孩对男孩说:

bash

复制代码
如果 你有房;那么
  我就嫁给你
或者 你有钱;那么
  我也可以嫁给你
否则
  我再考虑考虑
果如

实用示例:服务管理脚本

bash

复制代码
#!/bin/bash
# 通过参数控制sshd服务
if [ "$1" == "start" ];then
  systemctl start sshd
  echo "SSH服务已启动"
elif [ "$1" == "stop" ];then
  systemctl stop sshd
  echo "SSH服务已停止"
elif [ "$1" == "status" ];then
  systemctl status sshd
else
  echo "Usage: $0 start|stop|status"
fi

7.1.2 if条件语句多种条件表达式语法

if语句支持多种条件表达式,选择适合你的那种:

1. test条件表达式

bash

复制代码
if test 表达式;then
  指令
fi
2. \[\]条件表达式

bash

复制代码
if [ 字符串或算术表达式 ];then
  指令
fi
3. \[]条件表达式

bash

复制代码
if [[ 字符串或算术表达式 ]];then
  指令
fi
4. (())条件表达式

bash

复制代码
if ((算术表达式));then
  指令
fi
5. 命令表达式

bash

复制代码
if 命令;then
  指令
fi

建议:选择一种你习惯的表达式并保持一致,这样代码更易维护。

7.1.3 if条件语句实践

示例1:监控内存并报警

bash

复制代码
#!/bin/bash
# 每3分钟检查系统内存,低于100M时发邮件报警
FreeMem=$(free -m | awk 'NR==2 {print $4}')
if [ $FreeMem -lt 100 ];then
  echo "内存不足,当前可用内存: ${FreeMem}M" | mail -s "内存警报" root@localhost
fi

示例2:数字比较脚本

bash

复制代码
#!/bin/bash
# 比较两个数字的大小
read -p "请输入两个数字: " a b

if [ $a -lt $b ];then
  echo "$a < $b"
elif [ $a -eq $b ];then
  echo "$a = $b"
else
  echo "$a > $b"
fi

7.2 if条件语句企业案例精讲

7.2.1 监控Web和数据库服务

在实际工作中,我们经常需要监控重要服务的状态。下面是一个实用的监控示例:

bash

复制代码
#!/bin/bash
# 监控MySQL服务
if ss -lnt | grep -q ':3306';then
  echo "$(date) - MySQL服务运行正常"
else
  echo "$(date) - MySQL服务异常,正在重启..."
  systemctl restart mariadb
fi

# 监控Web服务
if wget --timeout=10 --tries=2 http://localhost -q;then
  echo "$(date) - Web服务运行正常"
else
  echo "$(date) - Web服务异常,正在重启..."
  systemctl restart httpd
fi

7.2.2 判断字符串是否为数字

在工作中,我们经常需要验证输入是否为数字:

bash

复制代码
#!/bin/bash
# 方法1:使用正则表达式
if [[ $1 =~ ^[0-9]+$ ]];then
  echo "$1 是数字"
else
  echo "$1 不是数字"
fi

# 方法2:使用sed替换
if [ -z "$(echo $1 | sed 's/[0-9]//g')" ];then
  echo "$1 是数字"
else
  echo "$1 不是数字"
fi

7.2.3 开发Rsync服务管理脚本

下面是一个完整的服务管理脚本示例:

bash

复制代码
#!/bin/bash
# Rsync服务管理脚本

# 检查参数数量
if [ $# -ne 1 ];then
  echo "Usage: $0 {start|stop|restart|status}"
  exit 1
fi

case "$1" in
start)
  rsync --daemon
  sleep 2
  if ss -lnt | grep -q ':873';then
    echo "Rsync服务启动成功"
  else
    echo "Rsync服务启动失败"
  fi
  ;;
stop)
  pkill rsync
  sleep 2
  if ! ss -lnt | grep -q ':873';then
    echo "Rsync服务已停止"
  else
    echo "Rsync服务停止失败"
  fi
  ;;
restart)
  pkill rsync
  sleep 2
  rsync --daemon
  echo "Rsync服务已重启"
  ;;
status)
  if ss -lnt | grep -q ':873';then
    echo "Rsync服务正在运行"
  else
    echo "Rsync服务未运行"
  fi
  ;;
*)
  echo "Usage: $0 {start|stop|restart|status}"
  exit 1
  ;;
esac

提示 :将这个脚本保存为/etc/init.d/rsyncd,并添加执行权限,就可以使用service rsyncd start|stop|restart|status来管理服务了。

ync

sleep 2

rsync --daemon

echo "Rsync服务已重启"

;;

status)

if ss -lnt | grep -q ':873';then

echo "Rsync服务正在运行"

else

echo "Rsync服务未运行"

fi

;;

*)

echo "Usage: $0 {start|stop|restart|status}"

exit 1

;;

esac

复制代码
> **提示**:将这个脚本保存为`/etc/init.d/rsyncd`,并添加执行权限,就可以使用`service rsyncd start|stop|restart|status`来管理服务了。

通过本章的学习,相信你已经掌握了if条件语句的核心用法。记住,编程就像学骑自行车,多练习才能熟练掌握。在实际工作中多加运用,你一定会成为Shell脚本高手!
相关推荐
ly76891 小时前
Docker 从入门到实践:镜像、容器、Dockerfile 与 Docker Compose 详解
运维·docker·容器
大鹏的NLP博客2 小时前
通用 Linux 嵌入式板端 C/C++ ABI 与 Glibc 依赖治理规范
linux·c++·交叉编译
用户3169353811832 小时前
ry.bat和ry.sh部署
运维
众人皆醒我独醉2 小时前
源码导读:一张地图看懂 KServe 仓库
面试·云计算·gpu
mennekes2 小时前
自动化产线临时配电:明装工业插座 vs 面板式工业插座 vs 模块化插座箱取舍
运维·科技·安全·制造
tedcloud1233 小时前
book-to-skill 怎么部署?把技术书和项目文档变成 AI Agent 可复用知识
linux·运维·服务器·人工智能·开源
旗开得胜马到成功3 小时前
SK海力士SSD售后翻车:企业备份介质裸奔风险与中科热备技术选型拆解
运维·服务器·网络
7177773 小时前
厘清 Gitee Test 能力边界:测试管理、自动化与 DevSecOps 协同路径
运维·gitee·自动化
瀚高PG实验室3 小时前
SQL优化案例:使用分区表优化SQL查询性能
linux·服务器·数据库·sql·microsoft·postgresql
brian00313 小时前
虚拟机vmware文件的后缀名汇总介绍
运维·vmware·后缀名