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脚本高手!
相关推荐
一休哥助手5 分钟前
Naive RAG:简单而高效的检索增强生成架构解析与实践指南
运维·人工智能·架构
入秋19 分钟前
Linux服务器安装部署 Nginx、Redis、PostgreSQL、Docker
linux·前端
Bi32 分钟前
包含多个子项目集成一个项目部署Vercel方法
运维·前端
Mr. Cao code1 小时前
使用Tomcat Clustering和Redis Session Manager实现Session共享
java·linux·运维·redis·缓存·tomcat
zcz16071278211 小时前
Linux 网络命令大全
linux·运维·网络
the sun341 小时前
Reactor设计模式及其在epoll中的应用
linux·运维·服务器·c++
VVVVWeiYee1 小时前
BGP高级特性
运维·服务器·网络
喜欢你,还有大家1 小时前
Linux笔记7——shell编程基础-1
linux·运维·笔记
运维成长记1 小时前
Top 100 Linux Interview Questions and Answers
linux·运维·服务器
人工智能训练师2 小时前
openEuler系统中如何将docker安装在指定目录
linux·运维·服务器·人工智能·ubuntu