一直很好奇shell命令行安装脚本的时候怎么实现自动增长进度条而且不增加新输出的问题。以前一直觉得是不断print出来东西,但是已经输出到命令行终端的为什么也能被覆盖呢,于是看到别人写的进度条,不断尝试,发现核心功能非常简单,就是不断的printf "\r"

代码如下

#!/bin/bash

processBar()
{
process=$1
whole=$2
printf "[%03d/%03d]\r" $process $whole
}

whole=100
process=0
while [ $process -lt $whole ]
do
let process++
processBar $process $whole
sleep 0.1
done
printf "\n"

然后我做了非常简单版本的核心代码

#!/bin/bash
printf "1\r"
sleep 1
printf "2\r"
sleep 1
printf "3\r"
sleep 1
printf "4\r"
sleep 1
printf "5\r"
sleep 1

我发现这样也能从 1 一直变到 5 。很让人费解这里面的原理是什么。

我看了一下 shell printf 解释参数中 \r 是回车的意思,至今还没搞懂是为什么。有网友明白的可以给我留言答疑解惑,不甚感激!

 后续更新(2020-05-22)

五分钟后 我好像有点眉目了

这个打印换行把刚刚输出的东西覆盖了,如果调换\r和数字顺序 发现后面的覆盖前面的最后留下来5,就是用回车进行覆盖,实现动态变化输出