一、基础语法篇
1. 变量定义与使用
变量命名规则:字母/数字/下划线,区分大小写
赋值符号=两侧不能有空格
使用$符号调用变量
示例脚本(script1.sh):
#!/bin/bash
# 定义变量
APP_NAME="web_server"
LOG_DIR="/var/log/${APP_NAME}"
MAX_SIZE=100 # 单位MB
# 使用变量
echo "应用程序名称: $APP_NAME"
echo "日志目录大小限制: ${MAX_SIZE}MB"
执行脚本:
chmod +x script1.sh && ./script1.sh
# 应输出变量内容
2. 条件判断
if语句格式:if [ condition ]; then ... fi
比较运算符:-eq, -ne, -gt, -lt (-eq是等于,-ne是不等于,-gt是大于,-lt是小于)
文件判断:-f(存在文件), -d(存在目录)
示例脚本(script2.sh):
#!/bin/bash
# 检查服务是否运行
SERVICE="nginx"
if systemctl is-active --quiet $SERVICE; then
echo "$SERVICE 正在运行"
elif [ -f "/usr/sbin/$SERVICE" ]; then
echo "$SERVICE 已安装但未启动"
else
echo "$SERVICE 未安装"
fi
# case语句示例
read -p "输入操作(start|stop|restart): " ACTION
case $ACTION in
start) systemctl start $SERVICE ;;
stop) systemctl stop $SERVICE ;;
restart) systemctl restart $SERVICE ;;
*) echo "无效操作" ;;
esac
执行脚本:
# 测试不同输入值观察输出变化
./script2.sh
3. 循环结构
for循环遍历列表/数组
while循环根据条件持续执行
示例脚本(script3.sh):
#!/bin/bash
# 遍历日志文件
for LOG_FILE in /var/log/*.log; do
echo "处理文件: $LOG_FILE"
gzip $LOG_FILE
done
# 数字循环
for i in {1..5}; do
echo "创建目录 folder$i"
mkdir "folder$i"
done
# while读取文件
while read USER; do
useradd $USER
done < users.txt
执行脚本:
./script3.sh
# 查看生成的目录和压缩日志
ls -ld folder* && file /var/log/messages*
4. 函数编写
使用function关键字或直接定义
通过$1, $2获取参数
示例脚本(script4.sh):
#!/bin/bash
function disk_alert() {
local USAGE=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')
if [ $USAGE -gt 90 ]; then
echo "警告:根分区使用率超过90%!"
return 1
fi
return 0
}
# 调用函数
disk_alert || mail -s "磁盘报警" admin@example.com
二、实战案例篇
案例1:日志清理脚本
#!/bin/bash
LOG_DIR="/var/log/app_logs"
MAX_DAYS=30
find $LOG_DIR -name "*.log" -type f -mtime +$MAX_DAYS -delete
echo "$(date) 已清理超过${MAX_DAYS}天的日志" >> /var/log/clean.log
脚本验证:touch -d "31 days ago" test.log 创建31天前的测试文件后执行脚本
案例2:服务监控脚本
#!/bin/bash
SERVICE="httpd"
if ! systemctl is-active $SERVICE >/dev/null; then
systemctl restart $SERVICE
echo "$(date) $SERVICE 已重启" >> /var/log/service_monitor.log
fi
案例3:批量创建用户
#!/bin/bash
USER_FILE="users.list"
while read USER PASS; do
useradd -m $USER
echo "$PASS" | passwd --stdin $USER
done < $USER_FILE
输入文件格式:
user1 Passw0rd1
user2 Passw0rd2
三、定时任务配置
编辑任务列表:crontab -e
添加定时规则:
# 每天凌晨3点清理日志
0 3 * * * /opt/scripts/log_clean.sh
# 每5分钟检查服务状态
*/5 * * * * /opt/scripts/service_monitor.sh
通过 crontab -l 查看当前用户的定时任务列表
查看执行记录tail -f /var/log/cron