如何在管道连续时将管道输出指定为变量



我想在下载文件到我的电报机器人的每 5 秒更新一次下载状态。同样在这里我正在使用 bash。

aria2c $url --summary-interval=5 2>&1 | tee output.log | grep -oP "(d+(.d+)?(?=%))"

这个东西每 5 秒后派生出我的下载百分比。我想为我的机器人使用此下载百分比来定期更新它。我试过这些

aria2c $url --summary-interval=5 2>&1 | tee output.log | grep -oP "(d+(.d+)?(?=%))" | { read text; curl -s "https://api.legram.org/bot${tg_token}/editMessageText" --data "message_id=${msg_id}&text=DOWNLOADED-${text}&chat_id=${ch_id}&parse_mode=HTML&disable_web_page_preview=True"; }

尝试 2

aria2c $url --summary-interval=5 2>&1 | tee output.log | text=$(grep -oP "(d+(.d+)?(?=%))") | curl -s "https://api.legram.org/bot${tg_token}/editMessageText" --data "message_id=${msg_id}&text=DOWNLOADED-${text}%&chat_id=${ch_id}&parse_mode=HTML&disable_web_page_preview=True"; }

但没有一个奏效。然后为了测试我尝试了这个

aria2c $url --summary-interval=5 2>&1 | tee output.log | grep -oP "(d+(.d+)?(?=%))" | { read text; echo "$text"; }

我终于得到了一个输出(这可能是第一次下载%),不像它应该是什么。任何人都可以给我工作代码。

问题是你只运行一次read(然后更新状态),所以它读取一行(并更新状态一次)。你需要一个循环,所以它会一遍又一遍地重复read+update过程。您可以使用while循环来执行此操作。如果在没有更多要处理的输入时应退出,请readwhile条件:

aria2c $url --summary-interval=5 2>&1 |
tee output.log |
grep -oP "(d+(.d+)?(?=%))" |
while read text; do
curl -s "https://api.legram.org/bot${tg_token}/editMessageText" --data "message_id=${msg_id}&text=DOWNLOADED-${text}&chat_id=${ch_id}&parse_mode=HTML&disable_web_page_preview=True"
done

最新更新