提问人:dataprolet 提问时间:8/22/2023 更新时间:8/22/2023 访问量:45
用于读取进度状态的 Bash 循环在空变量上结束?
Bash loop for reading progress status ends on empty variable?
问:
我正在尝试读取下载进度的 RESTful API 状态的输出并将其打印出来。下载完成后,状态将从“正在运行”更改为“定期终止”,并且不再显示“进度”指示器。因此,循环以空变量 $progress 结束。
因此,以下脚本正确显示了下载进度,但下载完成后,脚本会突然结束,并且不显示“下载完成”。
假设下载正在会话 1 上运行。
while true; do
status=$(curl -s -u admin:admin -H "Accept:application/json" -X GET \
-i http://1.2.3.4/sessionInformation/1/status | grep "Status" | sed 's/ "Status"://g' | sed 's/"//g')
while [[ $status != "terminated regularly" ]]; do
progress=$(curl -s -u admin:admin -H "Accept:application/json" -X GET \
-i http://1.2.3.4/sessionInformation/1/status | grep "Progress" | sed 's/["Progress":" %]//g')
echo -ne "Download ${progress} % finished.\r"
done
echo "Download finished."
break
done
下面是使用“set -x”运行的脚本的输出:
+ progress=99
+ echo -ne 'Download 99 % finished.\r'
+ [[ running, != \t\e\r\m\i\n\a\t\e\d\ \r\e\g\u\l\a\r\l\y ]]
++ curl -s -u admin:admin -H Accept:application/json -X GET -i http://1.2.3.4/sessionInformation/1/status
++ grep Progress
++ sed 's/["Progress":" %]//g'
+ progress=
我正在运行 MacOS Ventura 13.4.1 和 Bash 3.2.57(1)。
我尝试将整个事情包装在各种 if 语句和/或 while 循环中,但无论我读到什么作为下载完成和状态已更改的指示器,问题始终是空的 $progress 变量。 我也尝试使用 -z 检查$progress,但没有用。 我只想让循环发布进度,一旦下载完成,就可以继续执行任何操作,至少打印另一个提示,即它已经完成了。
答: 暂无答案
评论
curl
progress=$(curl -s ...
while [[ $status != "terminated regularly" ]]; do
status
break
grep -Po '"Status":\s*"\K[^"]*'
grep -Po '"Progress":\s*"\K[^"%]*'
jq
xmlstarlet
yq
grep -Po
-P
-o
sed -n 's/.*"Status":"\([^"]*\).*/\1/p'