如何给bash脚本添加条件,实现SFTP无csv文件时发告警邮件
Bash脚本修改方案
核心实现思路
先主动查询SFTP服务器上是否存在目标csv文件,只有确认文件存在时才执行后续下载、迁移、导入流程,不存在时直接触发邮件告警并终止脚本。
修改后完整脚本
#!/bin/bash # 配置项统一管理,按需修改 SFTP_USER="ftp" SFTP_PASS="password" SFTP_PORT="22001" SFTP_SERVER="server" LOCAL_SAVE_PATH="path/where/to/be/grabbed" ORIGIN_FILE_PATH="original/path" DEST_FILE_PATH="destination/path" MYSQL_LOGIN_PATH="user" ALERT_EMAIL="admin@example.com" # 第一步:检测SFTP服务器是否存在csv文件 sftp_file_exist=$(sshpass -p "${SFTP_PASS}" sftp -P "${SFTP_PORT}" "${SFTP_USER}@${SFTP_SERVER}" <<-'EOSSH' ls *.csv EOSSH ) # 判断是否检测到csv文件,没有则发告警退出 if [[ ! ${sftp_file_exist} =~ \.csv$ ]]; then # 发送告警邮件,可根据实际环境调整mailx为sendmail等其他邮件客户端 echo "SFTP服务器${SFTP_SERVER}未检测到待导入的csv文件,导入任务终止" | mailx -s "【告警】CSV数据导入任务失败" "${ALERT_EMAIL}" exit 1 fi # 第二步:文件存在时执行原有正常流程 # 下载csv文件 sshpass -p "${SFTP_PASS}" sftp -P "${SFTP_PORT}" "${SFTP_USER}@${SFTP_SERVER}" <<-'EOSSH1' lcd path/where/to/be/grabbed get *.csv EOSSH1 # 移动文件并修改权限 mv "${ORIGIN_FILE_PATH}" "${DEST_FILE_PATH}" chmod 777 "${DEST_FILE_PATH}" # 生产环境建议调整为最小必要权限,如644/755 # 导入MySQL mysql --login-path="${MYSQL_LOGIN_PATH}" < cmds.txt
关键逻辑说明
- 变量
${sftp_file_exist}存储SFTP服务器上ls *.csv的执行结果,通过正则匹配判断是否存在.csv后缀的文件 - 邮件告警依赖系统已配置好邮件发送服务,若
mailx命令不存在可替换为当前环境可用的邮件发送命令 - 原脚本的下载、迁移、导入逻辑没有改动,仅在确认文件存在后才会执行
可选优化项
- 生产环境不建议明文写SFTP密码在脚本中,可替换为SSH密钥认证方式
- 可添加文件下载完成后的完整性校验,避免下载不完整导致导入失败
- 可添加MySQL导入结果的判断,导入失败时也触发告警
内容的提问来源于stack exchange,提问作者Tristan
相关产品推荐
相关产品推荐

