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

AWK输出发送Telegram消息不完整问题求助

问题原因

你的脚本出现消息不完整的核心问题是xargs的参数分割逻辑:

  • xargs -l虽然按行处理输入,但默认会把行内的空格、制表符等空白字符当作参数分隔符,将整行拆成多个独立参数传递给telegram-send.sh。
  • 而telegram-send.sh只读取第一个参数$1,所以最终只发送了行内的第一个字段(#Price_Notification_ProductABC)。
解决方案

以下两种方案都能解决这个问题,任选其一即可:

方案1:修改xargs的参数传递方式

修改awk.sh中的管道部分,让xargs将整行作为单个参数传递:

#!/bin/bash

awk '
/^#Price_Notification_Product/ {
  prod = $0;
}
/^change: / {
  gsub(/[+%]/,"",$2);
  products[prod] += $2;
  $2 = "+" products[prod] "%"
}
1' input.txt | xargs -d '\n' -I {} ./telegram-send.sh "{}"
  • -d '\n':指定仅以换行符作为参数分隔符,避免拆分行内的空格。
  • -I {}:将输入的每一行替换为{},并用双引号包裹,确保整行作为单个参数传递。

方案2:改用while循环读取行

放弃xargs,用while read循环完整读取每一行:

#!/bin/bash

awk '
/^#Price_Notification_Product/ {
  prod = $0;
}
/^change: / {
  gsub(/[+%]/,"",$2);
  products[prod] += $2;
  $2 = "+" products[prod] "%"
}
1' input.txt | while IFS= read -r line; do
  ./telegram-send.sh "$line"
done
  • IFS= read -r line:IFS=保留行开头/结尾的空格,-r禁止转义反斜杠,确保完整读取每一行内容。
  • 用双引号包裹$line,确保整行作为单个参数传递给telegram-send.sh。
额外优化建议

为了避免消息中特殊字符(如&、=)被curl错误解析,建议修改telegram-send.sh中的curl命令,将--data "text=$1"替换为--data-urlencode "text=$1":

curl -s --data-urlencode "text=$1" --data "chat_id=$GROUP_ID" "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" > /dev/null

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:44:51