一、基础语法篇
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.sh3. 循环结构
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
