Shell 脚本编程:七个提高效率的自动化脚本

Shell脚本是Linux系统管理和自动化任务的强大工具。通过编写脚本,我们可以将重复性工作自动化,大幅提升效率。

本文将介绍七个实用Shell脚本,涵盖文件管理、系统监控、数据处理等常见场景,适合初学者学习参考。

1. 自动备份重要文件

场景:定期备份/home/user/documents目录到/backup,并压缩存档。

复制
#!/bin/bash # 定义源目录和目标目录 SOURCE_DIR="/home/user/documents" BACKUP_DIR="/backup" DATE=$(date +%Y-%m-%d) # 创建备份文件(带日期) tar -czf "$BACKUP_DIR/backup_$DATE.tar.gz" "$SOURCE_DIR" # 输出成功信息 echo "Backup completed: $BACKUP_DIR/backup_$DATE.tar.gz"1.2.3.4.5.6.7.8.9.10.11.12.13.

说明:

tar -czf:压缩目录为.tar.gz文件。date +%Y-%m-%d:获取当前日期,用于文件名。2. 监控磁盘空间并发送警报

场景:当磁盘使用率超过90%时发送邮件报警。

复制
#!/bin/bash THRESHOLD=90 CURRENT=$(df / | grep / | awk {print $5} | sed s/%//g) if [ "$CURRENT" -gt "$THRESHOLD" ]; then echo "Disk usage is $CURRENT% on $(hostname)" | mail -s "Disk Alert" admin@example.com fi1.2.3.4.5.6.7.8.

说明:

df /:获取根分区磁盘使用率。mail:发送邮件(需配置邮件服务)。3. 自动清理旧日志文件

场景:删除/var/log下超过30天的日志文件。

复制
#!/bin/bash find /var/log -type f -name "*.log" -mtime +30 -exec rm {} \;1.2.

说明:

find -mtime +30:匹配修改时间超过30天的文件。-exec rm {} \;:对找到的文件执行删除操作。4. 检查服务器存活状态

场景:检测一组服务器是否在线。

复制
#!/bin/bash SERVERS=("192.168.1.1" "192.168.1.2" "example.com") for server in "${SERVERS[@]}"; do ping -c 1 "$server" &> /dev/null && echo "$server is UP" || echo "$server is DOWN" done1.2.3.4.5.6.7.

说明:

ping -c 1:发送1次ICMP请求。&> /dev/null:忽略输出,仅显示结果。5. 密码生成器

场景:生成随机密码(含大小写字母、数字、符号)。

复制
#!/bin/bash LENGTH=12 PASSWORD=$(tr -dc A-Za-z0-9!@#$%^&* < /dev/urandom | head -c "$LENGTH") echo "Generated Password: $PASSWORD"1.2.3.4.

说明:

/dev/urandom:Linux随机数设备。tr -dc:过滤指定字符集。6. 实时监控DNS解析状态

场景:持续检查域名是否能正常解析,失败时记录日志。

复制
#!/bin/bash domain="example.com" log_file="dns.log" while true; do result=$(dig +short $domain) [ -z "$result" ] && echo "$(date): DNS failed" >> $log_file sleep 1 done1.2.3.4.5.6.7.8.9.10.

说明:

dig +short:快速获取DNS解析结果。空结果时记录日志,适合监控关键域名可用性。7. HTTP服务监控脚本

场景:持续检测网站可用性,记录访问状态码

复制
#!/bin/bash url="http://example.com" log_file="http_test.log" while true; do http_result=$(curl -s -o /dev/null -w "%{http_code}" $url) if [ $http_result -eq 200 ]; then echo "$(date): HTTP request to $url succeeded (Status: $http_result)" >> $log_file else echo "$(date): HTTP request to $url failed (Status: $http_result)" >> $log_file fi sleep 1 done1.2.3.4.5.6.7.8.9.10.11.12.13.14.

说明:

curl -w "%{http_code}":获取HTTP状态码状态码200时记录成功,其他状态记录失败

THE END