如何在管道连续时将管道输出分配为变量
How to assign a piped output as a variable while pipe is continuous
我想每 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"; }
但是 none 有效。然后为了测试我试了这个
aria2c $url --summary-interval=5 2>&1 | tee output.log | grep -oP "(\d+(\.\d+)?(?=%))" | { read text; echo "$text"; }
我最后只得到一个输出(这可能是第一次下载 %),不像它应该的那样。谁能给我工作代码。
问题是你只运行 read
(然后更新状态)一次,所以它只读取一行(并更新状态一次)。你需要一个循环,所以它会一遍又一遍地重复 read
+更新过程。您可以使用 while
循环来执行此操作。如果在没有更多输入要处理时应该退出,请将 read
设置为 while
条件:
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
我想每 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"; }
但是 none 有效。然后为了测试我试了这个
aria2c $url --summary-interval=5 2>&1 | tee output.log | grep -oP "(\d+(\.\d+)?(?=%))" | { read text; echo "$text"; }
我最后只得到一个输出(这可能是第一次下载 %),不像它应该的那样。谁能给我工作代码。
问题是你只运行 read
(然后更新状态)一次,所以它只读取一行(并更新状态一次)。你需要一个循环,所以它会一遍又一遍地重复 read
+更新过程。您可以使用 while
循环来执行此操作。如果在没有更多输入要处理时应该退出,请将 read
设置为 while
条件:
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