📅  最后修改于: 2023-12-03 15:22:57.963000             🧑  作者: Mango
在 Shell/Bash 脚本中,有时需要展示一个任务的进度,以提供更好的用户体验。然而,如果进度信息不同步显示,用户可能会感到困惑或不可靠。因此,在本文中,我们将介绍如何同步显示进度。
显示进度的基本语法是在输出中使用转义字符 \r。这个字符会将输出光标移到行首,以便能够覆盖以前输出的内容。例如,以下代码片段将每秒更新运行时间:
#!/bin/bash
SECONDS=0
while true; do
echo -ne "$(date -d@$SECONDS -u +%H:%M:%S)\r"
sleep 1
done
输出的效果如下:
00:00:01
00:00:02
00:00:03
...
在此示例中,我们使用了 echo 的选项 -n(不打印行结尾)和 -e(启用转义字符),以及 - 的组合来打印格式化文本。后面跟 \r 将输出光标移到开头,以便在下一行中输出。sleep 命令可以控制更新速度。
有趣的是,“覆盖”文本的长度可以比前面输出的文本长度短,因此可以在进度条中显示百分比。例如,以下代码片段跟踪了正在读取的文件的百分比:
#!/bin/bash
total_lines=$(wc -l < file.txt)
lines_read=0
while read line; do
lines_read=$((lines_read+1))
percent=$((lines_read*100/total_lines))
echo -ne "Progress: $percent%\r"
done < file.txt
请注意,在上面的代码中,我们没有使用 read 命令的 -r(忽略转义字符)选项。如果在读取行时省略该选项,将无法正确处理转义字符,并可能破坏代码的输出。
上述示例能够实现基本的进度条,但是如果需要自定义显示进度条,可以使用 tput 命令。以下是一个示例代码片段:
#!/bin/bash
cols=$(tput cols)
total_lines=$(wc -l < file.txt)
lines_read=0
while read line; do
lines_read=$((lines_read+1))
percent=$((lines_read*100/total_lines))
bar_size=$((cols*percent/100))
bar=$(printf "%${bar_size}s" | tr ' ' '#')
echo -ne "Progress: $bar ($percent%)\r"
done < file.txt
在这个示例中,我们使用 tput cols 命令获取终端宽度,然后使用 printf 和 tr 命令来填充百分比和哈希表示的进度条。要生成动画效果,可以使用 sleep 命令。
现在,我们已经掌握了如何在 Shell/Bash 脚本中同步显示进度。可以使用转义字符 \r 覆盖前一个输出,或使用 tput 命令自定义进度条。这样,用户可以看到任务的进展情况,提高了脚本的可用性。