📜  同步显示进度 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:22:57.963000             🧑  作者: Mango

同步显示进度 - Shell/Bash

在 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 命令自定义进度条。这样,用户可以看到任务的进展情况,提高了脚本的可用性。