You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

bash脚本用mailx处理xlsx文件邮件时报错,求修复指导

修复后的Bash脚本及错误说明

原脚本的核心错误

  • 变量赋值语法错误:file= ls *.xlsx -l 会直接执行ls命令,file变量未被正确赋值,导致后续du命令找不到文件,出现“ls: No such file or directory”。
  • 条件判断语法错误:if [ $actsize -gt $min]; then 中$min与]之间缺少空格,bash无法正确解析条件,触发“-gt: unary operator expected”。
  • 未处理多文件场景:原脚本未循环遍历所有.xlsx文件,无法分别处理两个不同大小的文件。
  • mailx参数错误:-a选项后需直接指定附件文件路径,不能搭配ls命令。

修复后的脚本

#!/bin/bash

# 目标目录
TARGET_DIR="/opt/alb_test/alb/albt1/Source/alb/al/conversion/scr"
MIN_SIZE=6  # 单位:MB
RECIPIENT="test@testmail.com"

# 切换到目标目录,失败则退出
cd "$TARGET_DIR" || { echo "无法进入目录 $TARGET_DIR"; exit 1; }

# 遍历所有.xlsx文件
for file in *.xlsx; do
    # 检查是否存在匹配的文件(避免无xlsx文件时出错)
    [ -f "$file" ] || continue

    # 获取文件大小(MB,向上取整)
    actsize=$(du -m "$file" | cut -f1)

    # 邮件主题
    SUBJECT="文件通知: $file"

    if [ "$actsize" -gt "$MIN_SIZE" ]; then
        # 文件超过6MB,发送仅含信息的邮件
        BODY="文件 $file 大小为 ${actsize}MB(超过${MIN_SIZE}MB),存放路径:$TARGET_DIR"
        echo "$BODY" | mailx -s "$SUBJECT" "$RECIPIENT"
    else
        # 文件小于等于6MB,发送带附件的邮件
        BODY="文件 $file 大小为 ${actsize}MB(小于等于${MIN_SIZE}MB),附件为该文件"
        echo "$BODY" | mailx -a "$file" -s "$SUBJECT" "$RECIPIENT"
    fi
done

关键修复点说明

  • 使用for file in *.xlsx遍历所有目标文件,确保每个文件都被处理。
  • 增加目录切换失败的判断(cd ... || { ... }),避免后续命令在错误路径执行。
  • 修复条件判断的空格问题:[ "$actsize" -gt "$MIN_SIZE" ],同时给变量加双引号,避免空值导致语法错误。
  • 正确使用mailx的-a选项,直接指定附件文件$file。
  • 增加邮件主题和明确的邮件内容,提升通知可读性。
  • 增加[ -f "$file" ]判断,防止目录中无.xlsx文件时for循环处理*.xlsx字符串本身。

内容的提问来源于stack exchange,提问作者Jenifer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:05:25