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
相关产品推荐
相关产品推荐

