予枫个人主页 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》 Debug 这个世界Return 更好的自己引言作为运维或后端开发手动备份数据库、清理过期日志是家常便饭重复操作既耗时又容易出错。学会Shell脚本编程就能将这些繁琐工作自动化一次编写、终身复用。本文从Shell核心语法入手手把手教你写一个“自动备份数据库清理7天前日志”的实用脚本再补充调试技巧新手也能快速上手看完直接复制可用文章目录一、Shell核心语法脚本入门必备吃透这4个就能写基础脚本1. 变量引用简化代码提升可维护性语法规则实例演示2. If 判断实现脚本的条件分支语法规则3种常用场景关键注意点实例演示判断备份目录是否存在3. For/While 循环实现重复操作1For循环适合固定次数的循环推荐用于遍历语法规则实例演示遍历7天前的日志文件用于后续清理2While循环适合不确定次数的循环如循环直到命令执行成功语法规则实例演示循环检测数据库连接直到连接成功4. Case 语句多分支简化版替代多elif语法规则实例演示根据脚本参数执行不同操作二、实战案例自动备份数据库并清理7天前日志直接复制可用完整脚本含详细注释脚本使用步骤新手必看三、Shell脚本调试技巧遇到报错不用慌核心调试方法sh -x 调试模式最常用使用方法调试结果解读实例演示排查备份失败问题其他常用调试技巧补充四、结尾总结一、Shell核心语法脚本入门必备吃透这4个就能写基础脚本Shell脚本的核心语法并不复杂重点掌握变量、判断、循环、分支这4个知识点就能应对大部分日常运维脚本场景。以下语法均结合实例说明好懂又好记建议点赞收藏写脚本时直接对照参考 ✅1. 变量引用简化代码提升可维护性变量是Shell脚本的基础用于存储常量如数据库地址、备份路径后续修改只需改变量值无需改动整个脚本极大提升可维护性。语法规则定义变量变量名值注意等号两边不能有空格这是新手最容易踩的坑引用变量$变量名或${变量名}推荐用后者避免变量名与其他字符混淆特殊变量$0脚本名称、$1-$9脚本传入的参数、$?上一条命令执行结果0为成功非0为失败实例演示# 定义变量数据库相关配置后续可直接修改DB_NAMEtest_db# 数据库名称DB_USERroot# 数据库用户名DB_PASS123456# 数据库密码BACKUP_PATH/home/backup/db# 备份文件存储路径# 引用变量打印配置信息echo当前备份的数据库${DB_NAME}echo备份文件将存储至${BACKUP_PATH}2. If 判断实现脚本的条件分支If 判断是脚本的“大脑”用于根据不同条件执行不同的命令如判断备份路径是否存在、备份是否成功。语法规则3种常用场景# 场景1单条件判断if[条件表达式];then执行命令条件成立时fi# 场景2双条件判断二选一if[条件表达式];then执行命令1条件成立时else执行命令2条件不成立时fi# 场景3多条件判断多选一if[条件表达式1];then执行命令1elif[条件表达式2];then执行命令2else执行命令3fi关键注意点条件表达式前后必须有空格如[ -d ${BACKUP_PATH} ]不能写成[-d ${BACKUP_PATH}]常用判断符-d判断是否为目录、-f判断是否为文件、-eq等于用于数字比较、-ne不等于实例演示判断备份目录是否存在# 判断备份目录是否存在不存在则创建if[!-d${BACKUP_PATH}];thenecho备份目录${BACKUP_PATH}不存在正在创建...mkdir-p${BACKUP_PATH}# -p选项创建多级目录避免报错echo目录创建成功elseecho备份目录${BACKUP_PATH}已存在跳过创建步骤fi3. For/While 循环实现重复操作循环用于执行重复任务如遍历文件、批量处理日志Shell中最常用的是For循环和While循环按需选择即可。1For循环适合固定次数的循环推荐用于遍历语法规则# 场景1遍历列表for变量in列表;do执行命令每次循环获取列表中的一个值done# 场景2固定次数循环如循环5次for((i1;i5;i));do执行命令done实例演示遍历7天前的日志文件用于后续清理# 遍历备份目录下7天前的.log日志文件后续用于清理forlog_filein$(find${BACKUP_PATH}-name*.log-mtime 7);doecho发现7天前日志${log_file}# 后续添加删除命令此处先打印预览done2While循环适合不确定次数的循环如循环直到命令执行成功语法规则while[条件表达式];do执行命令条件成立时持续循环done实例演示循环检测数据库连接直到连接成功# 循环检测数据库连接直到连接成功while!mysql -u${DB_USER}-p${DB_PASS}-eexit/dev/null21;doecho数据库连接失败正在重试...sleep3# 暂停3秒后重试避免频繁重试占用资源doneecho数据库连接成功可以开始备份4. Case 语句多分支简化版替代多elif当判断条件较多时用If-elif会显得代码繁琐Case语句可以简化多分支判断更简洁、易维护如根据脚本参数执行不同操作。语法规则case$变量in选项1)执行命令1;;# 结束当前分支双分号不能少选项2)执行命令2;;*)# 默认分支所有选项不匹配时执行执行命令3;;esac实例演示根据脚本参数执行不同操作# 根据脚本传入的参数执行不同操作如 ./backup.sh backup 执行备份./backup.sh clean 执行清理case$1inbackup)echo开始执行数据库备份操作...# 后续添加备份命令;;clean)echo开始执行日志清理操作...# 后续添加清理命令;;*)echo参数错误请输入正确参数backup备份/ clean清理exit1# 退出脚本返回错误状态码;;esac二、实战案例自动备份数据库并清理7天前日志直接复制可用掌握核心语法后我们来写一个实用脚本——自动备份MySQL数据库压缩备份文件并自动清理7天前的备份日志和过期日志可直接部署到服务器设置定时任务crontab实现完全自动化。完整脚本含详细注释#!/bin/bash# 脚本名称db_backup_and_clean.sh# 脚本功能自动备份MySQL数据库压缩备份文件清理7天前过期日志和备份文件# 作者予枫CSDN# 日期2026-02-09# 备注使用前请修改数据库配置和路径配置############################################################################### 1. 配置参数使用前务必修改以下参数适配自己的服务器环境##############################################################################DB_NAMEtest_db# 要备份的数据库名称可多个用空格分隔如 db1 db2DB_USERroot# 数据库用户名DB_PASS123456# 数据库密码如果密码有特殊字符用引号包裹BACKUP_PATH/home/backup/db# 备份文件和日志文件存储路径LOG_FILE${BACKUP_PATH}/backup_log.log# 备份日志文件记录备份/清理过程RETENTION_DAYS7# 日志/备份文件保留天数此处设为7天可修改############################################################################### 2. 函数定义简化脚本提升可读性############################################################################### 函数1打印日志记录时间和操作方便后续排查问题log(){echo[$(date%Y-%m-%d %H:%M:%S)]$1${LOG_FILE}}# 函数2检测数据库连接确保备份前数据库可正常访问check_db_connection(){log开始检测数据库连接...ifmysql -u${DB_USER}-p${DB_PASS}-eexit/dev/null21;thenlog数据库连接成功return0elselog错误数据库连接失败请检查用户名、密码是否正确exit1# 连接失败退出脚本fi}# 函数3数据库备份核心功能db_backup(){log 开始数据库备份 # 判断备份目录是否存在不存在则创建if[!-d${BACKUP_PATH}];thenlog备份目录${BACKUP_PATH}不存在正在创建...mkdir-p${BACKUP_PATH}log目录创建成功fi# 遍历所有要备份的数据库逐个备份fordbin${DB_NAME};do# 定义备份文件名格式数据库名_日期时间.sql.gz压缩存储节省空间BACKUP_FILE${BACKUP_PATH}/${db}_$(date%Y%m%d%H%M%S).sql.gz# 执行备份命令mysqldump备份数据库gzip压缩log正在备份数据库${db}备份文件${BACKUP_FILE}mysqldump -u${DB_USER}-p${DB_PASS}--single-transaction${db}|gzip${BACKUP_FILE}# 判断备份是否成功if[$?-eq0];thenlog数据库${db}备份成功elselog错误数据库${db}备份失败rm-f${BACKUP_FILE}# 删除失败的备份文件避免占用空间fidonelog 备份操作结束 }# 函数4清理过期文件清理7天前的备份文件和日志文件clean_expired_files(){log 开始清理过期文件 # 清理7天前的备份文件.sql.gz格式log正在清理${RETENTION_DAYS}天前的备份文件...find${BACKUP_PATH}-name*.sql.gz-mtime ${RETENTION_DAYS}-execrm-f{}\;log备份文件清理完成# 清理7天前的日志文件.log格式除了当前日志文件log正在清理${RETENTION_DAYS}天前的日志文件...find${BACKUP_PATH}-name*.log-mtime ${RETENTION_DAYS}-and -not -name$(basename${LOG_FILE})-execrm-f{}\;log日志文件清理完成log 清理操作结束 }############################################################################### 3. 脚本主逻辑执行顺序检测连接 → 备份 → 清理############################################################################### 调用函数执行备份和清理check_db_connection db_backup clean_expired_files# 打印脚本执行完成信息log脚本执行完毕详细日志请查看${LOG_FILE}echo脚本执行完毕详细日志请查看${LOG_FILE}脚本使用步骤新手必看修改配置参数打开脚本找到「配置参数」部分修改数据库名称、用户名、密码、备份路径适配自己的服务器环境这一步不能漏。赋予脚本执行权限执行命令chmod x db_backup_and_clean.sh没有执行权限脚本无法运行。测试脚本执行命令./db_backup_and_clean.sh查看是否能正常备份、清理无报错即测试成功。设置定时任务可选实现完全自动化执行crontab -e打开定时任务编辑界面。添加一行命令如每天凌晨2点执行备份0 2 * * * /home/backup/db_backup_and_clean.sh。保存退出定时任务生效后续无需手动执行脚本。三、Shell脚本调试技巧遇到报错不用慌新手写脚本难免会遇到报错如语法错误、执行失败掌握以下调试技巧能快速定位问题、解决问题节省大量时间。核心调试方法sh -x 调试模式最常用这是Shell脚本最实用的调试方法无需修改脚本只需在执行脚本时加上-x选项就能打印出脚本执行的每一步命令和变量值清晰看到哪里出错。使用方法# 格式sh -x 脚本名称sh-x db_backup_and_clean.sh调试结果解读执行后终端会输出每一步的执行过程其中开头的行脚本实际执行的命令包括变量替换后的真实命令。不带的行脚本中的echo输出或日志输出。实例演示排查备份失败问题假设执行脚本时提示“备份失败”用sh -x调试sh-x db_backup_and_clean.sh如果输出中出现 mysqldump -uroot -p123456 --single-transaction test_db | gzip /home/backup/db/test_db_20260209100000.sql.gz且后续提示mysqldump: command not found则说明「mysqldump命令不存在」解决方案安装mysql-client即可。其他常用调试技巧补充语法检查执行sh -n 脚本名称仅检查脚本语法错误不执行脚本快速排查括号不匹配、缺少分号等问题。逐行执行在脚本中添加read -p 按回车继续执行下一步每执行一步暂停方便观察每一步的执行结果。日志调试在关键步骤添加echo 变量值或日志输出查看变量是否正确、命令是否执行。四、结尾总结本文从Shell核心语法变量、If判断、For/While循环、Case语句入手手把手教大家写了一个“自动备份数据库清理7天前日志”的实用脚本还补充了脚本使用步骤和调试技巧覆盖了新手从入门到实战的全流程。Shell脚本是运维人员的“效率神器”学会它能将大量重复的手动操作自动化节省更多时间去做更有价值的事。本文的脚本可以直接复制修改使用建议收藏起来后续遇到类似需求直接复用即可。如果在使用脚本的过程中遇到问题或者有其他Shell脚本相关的疑问欢迎在评论区留言讨论我会一一回复