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

Bash脚本向Rocket Chat发送文件列表为空问题排查求助

解决Rocket Chat消息空白的问题

你的脚本里有几个关键的Bash语法错误导致变量传递失败,我帮你梳理并修正:

主要错误点

  • 变量赋值的空格问题:out= $(sed ...) 这行里=和$之间有空格,Bash会把out=当成命令执行,而不是变量赋值,直接导致out变量为空。
  • 命令替换与引号的混乱:MESSAGE=$(rc_message \" ${out}\") 这行的引号和反引号完全用错了——反引号是用来执行命令的,但你这里只是想传递变量内容,不需要反引号,多余的转义引号也会干扰参数传递。
  • Sed正则兼容性问题:sed 's/\s\+/\\n/g' 里的\s在基础Sed版本中不生效,应该用[[:space:]]\+或者加上-r选项启用扩展正则表达式。

修正后的完整脚本

set -x
source rocket.sh

# 如果你需要持久化prev_count(比如跨脚本运行保留计数),建议写到文件中:
# prev_count=$(cat /home/prev_count.txt 2>/dev/null || echo 0)
prev_count=0
path="/home/Files/"

LOG="/home/message"
# 先清空旧的日志内容,避免残留信息干扰
> "$LOG"
echo "These are the files that need to be deleted" >> "$LOG"
echo "+----------------------------------------+" >> "$LOG"
echo "" >> "$LOG"
# 直接把find结果用awk整理后写入LOG,省去中间临时文件
find "$path" -type f -mmin +10 -exec ls -ltrah {} \; | awk '{print $6,$7,$9}' >> "$LOG"
echo "" >> "$LOG"

# 计算实际的文件行数(减去LOG里的4行表头内容)
count=$(wc -l < "$LOG" | awk '{print $1 - 4}')

if [[ "$prev_count" -lt "$count" ]]; then
    # 读取LOG内容,把空格替换为换行符适配Rocket Chat格式
    out=$(cat "$LOG" | sed 's/[[:space:]]\+/\\n/g')
    # 正确调用rc_message生成消息,直接传递变量内容
    MESSAGE=$(rc_message "$out")
    echo "$MESSAGE"
    # 发送消息到Rocket Chat
    rc_post "$MESSAGE"
    
    # 如果需要更新持久化的prev_count,写入文件
    # echo "$count" > /home/prev_count.txt
fi

关键修改说明

  1. 修复变量赋值:把out= $(sed ...)改成out=$(sed ...),去掉=后的空格,确保Bash正确识别变量赋值操作。
  2. 简化消息生成逻辑:直接读取整理好的$LOG内容作为消息源,避免重复处理临时文件,逻辑更清晰。
  3. 正确传递参数:MESSAGE=$(rc_message "$out")直接把$out作为参数传递给rc_message,不需要多余的转义或命令替换符号。
  4. 路径加引号:find "$path"避免路径中包含空格时出现解析错误。
  5. 优化计数逻辑:原来的count统计的是原始ls输出的行数,现在改为计算LOG里的实际文件行数,让prev_count的比较更准确。

如果你的rc_message函数需要特定格式(比如Markdown),可以调整Sed的替换规则,比如把换行符换成<br>或者保留原生换行,根据Rocket Chat的格式支持情况调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:22:42