文章目录
深入Linux Shell脚本编程:循环与分支结构的高级应用
在Linux系统管理和自动化任务中,Shell脚本是一个非常强大的工具。Shell脚本不仅能够简化日常管理任务,还能通过复杂的逻辑控制和自动化流程来提升效率。本篇博客将深入探讨Shell脚本中的循环与分支结构的高级应用,帮助读者掌握这些关键技术,以便在实际工作中灵活运用。
一、循环结构详解
循环结构是Shell脚本中常用的控制结构之一,能够实现重复执行某段代码,直到满足特定条件为止。主要包括for
循环和while
循环。
1. for
循环
for
循环用于遍历一组值,并对每个值执行一系列命令。其基本格式如下:
for 变量名 in 取值列表
do
命令序列
done
以下是一个示例,展示如何使用for
循环批量添加用户:
#!/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST
do
useradd $UNAME
echo "123456" | passwd --stdin $UNAME
done
上述脚本从/root/users.txt
文件中读取用户名列表,然后为每个用户名创建用户,并设置初始密码。
1.1 应用示例:检查主机状态
另一个常见的for
循环应用是批量检查主机状态。以下脚本读取IP地址列表,并使用ping
命令检查每个主机的连通性:
#!/bin/bash
HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $IP is up."
else
echo "Host $IP is down."
fi
done
该脚本从/root/ipadds.txt
文件中读取IP地址列表,并通过ping
命令检查每个IP的连通性。如果主机在线,返回“Host $IP is up.”,否则返回“Host $IP is down.”。
2. while
循环
while
循环用于重复执行某段代码,只要条件成立就继续执行。其基本格式如下:
while 条件测试操作
do
命令序列
done
以下是一个示例,展示如何使用while
循环批量添加用户:
#!/bin/bash
PREFIX="stu"
i=1
while [ $i -le 20 ]
do
useradd ${PREFIX}$i
echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null
let i++
done
上述脚本创建20个以stu
为前缀的用户,用户编号从1到20,并设置初始密码。
2.1 应用示例:猜价格游戏
以下是一个使用while
循环的简单猜价格游戏脚本:
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格为0-999之间,猜猜看是多少?"
while true
do
read -p "请输入你猜测的价格数目:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜你答对了,实际价格是 $PRICE"
echo "你总共猜测了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
fi
done
该脚本生成一个0到999之间的随机数作为商品价格,并提示用户猜测价格。根据用户输入的价格,脚本会给出“太高了”或“太低了”的提示,直到用户猜中为止。
二、分支结构详解
分支结构用于根据不同的条件执行不同的命令。主要包括if
语句和case
语句。
1. if
语句
if
语句用于根据条件测试的结果执行不同的命令序列。if
语句有单分支结构、双分支结构和多分支结构三种形式。
1.1 单分支结构
单分支结构用于在条件成立时执行一段代码,其基本格式如下:
if 条件测试操作
then
命令序列
fi
例如,判断目录是否存在,如果不存在则创建目录:
#!/bin/bash
MOUNT_DIR="/media/cdrom/"
if [ ! -d $MOUNT_DIR ]
then
mkdir -p $MOUNT_DIR
fi
1.2 双分支结构
双分支结构用于在条件成立时执行一段代码,而在条件不成立时执行另一段代码,其基本格式如下:
if 条件测试操作
then
命令序列1
else
命令序列2
fi
例如,判断主机是否存活,并显示检测结果:
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is up."
else
echo "Host $1 is down."
fi
1.3 多分支结构
多分支结构用于在多个条件之间进行选择,其基本格式如下:
if 条件测试操作1
then
命令序列1
elif 条件测试操作2
then
命令序列2
else
命令序列3
fi
例如,判断分数范围并分出优秀、合格和不合格三个档次:
#!/bin/bash
read -p "请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE 分!优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "$GRADE 分,合格"
else
echo "$GRADE 分?不合格"
fi
2. case
语句
case
语句用于针对变量的不同取值分别执行不同的命令序列,其基本格式如下:
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……
* )
默认命令序列
esac
例如,击键类型识别脚本,判断用户输入的字符是字母、数字还是其他字符:
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是 字母。"
;;
[0-9])
echo "您输入的是 数字。"
;;
*)
echo "您输入的是 空格、功能键或其他控制字符。"
esac
2.1 应用示例:编写系统服务脚本
以下是一个使用case
语句编写的系统服务脚本,用于启动、停止和重启服务:
#!/bin/bash
# chkconfig: - 90 10
# description: Startup script for sleep Server
case "$1" in
start)
echo "正在启动sleep服务 ... OK"
;;
stop)
echo "正在停止sleep服务 ... OK"
;;
restart)
$0 stop
$0 start
;;
*)
echo "用法: $0 {start|stop|restart}"
esac
三、综合应用案例
通过结合使用循环结构和分支结构,我们可以编写出功能强大且灵活的Shell脚本。以下是一个实际应用案例:监控服务器资源并发送告警邮件。
1. 需求描述
编写监控脚本sysmon.sh
,在以下情况时告警:
- 磁盘占用率超过90%
- CPU使用率超过80%
- 内存使用率超过90%
脚本每半小时检查一次,并通过邮件发送告警。
2. 实现思路
- 使用
df
、mpstat
、free
等命令提取各种监控指标 - 将各指标与正常值进行比较,保存异常情况
- 检查异常记录,若存在则发送告警邮件
- 设置
crontab
任务,定期调用sysmon.sh
脚本
3. 代码实现
以下是sysmon.sh
脚本的具体实现:
#!/bin/bash
# 获取当前的时间戳
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
# 定义告警函数
send_alert() {
local message=$1
echo "$message" | mail -s "System Monitor Alert" admin@example.com
}
# 检查磁盘占用率
disk_usage=$(df / | grep / | awk '{ print $5 }' | sed 's/%//g')
if [ $disk_usage -gt 90 ]; then
send_alert "[$timestamp] Disk usage is above 90%: ${disk_usage}%"
fi
# 检查CPU使用率
cpu_usage=$(mpstat 1 1 | grep "Average" | awk '{print 100 - $NF}')
if [ $(echo "$cpu_usage > 80" | bc) -ne 0 ]; then
send_alert "[$timestamp] CPU usage is above 80%: ${cpu_usage}%"
fi
# 检查内存使用率
memory_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
if [ $(echo "$memory_usage > 90" | bc) -ne 0 ]; then
send_alert "[$timestamp] Memory usage is above 90%: $1.14MB%"
fi
4. 设置定时任务
使用crontab
设置每半小时执行一次sysmon.sh
脚本:
*/30 * * * * /path/to/sysmon.sh
四、总结
Shell脚本中的循环结构和分支结构是实现自动化任务的关键工具。通过灵活运用这些工具,我们可以编写高效、可靠的脚本来处理复杂的任务。在实际应用中,结合系统的具体需求,编写适合的Shell脚本,可以极大地提高工作效率和系统稳定性。
最后,愿大家都可以解决工作中和生活中遇到的难题,剑锋所指,所向披靡~
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » Linux安全与高级应用(七)深入Linux Shell脚本编程:循环与分支结构的高级应用
发表评论 取消回复