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脚本高手!