shell脚本实现简单的进度条效果

刚好今天写了一个比较耗时的shell脚本,发现在一直在等实在是很枯燥,就想模仿一下其他命令一样有个进度展示的效果,哪怕不准确,很简陋也行,总比一直看着没输出要好吧。。。

废话不说先贴上自己的代码,下面再说一些地方。

#!/bin/bash
str_repeat() {
count=$1
str=''
while [ $count -ge 1 ];
do
     str=#$str;
     count=$(($count-1))
done
echo $str
}

ids="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25"
len=`echo $ids | awk '{print NF-1}'`
i=0
str=''
rate=$((100/$len))
rate=$(($rate+1))
for id in $ids
do
    per=$(($i*$rate))
    if [ "$per" -gt 100 ];then
        per=100
        printf "[%-${len}s]%.0f%%\r" `str_repeat $len` $per
        echo
        exit;
    fi
    if [ "$str" = '' ];then
        printf "[%-${len}s]%.0f%%\r" '' $per
    else
        printf "[%-${len}s]%.0f%%\r" $str $per
    fi
    i=$(($i+1))
    str=#$str
    sleep 0.1
done
echo
  • 1、利用awk命令处理预定义的字符串,得到可以的循环的列表和循环长度
  • 2、进度上主要是利用printf函数的格式化输出实现的,'\r'选项可以让光标重新回到起始位置,覆盖之前的输出,达到进度在不断变化的效果
  • 3、据我知道的shell好像是不支持浮点数运算的,所以进度百分比的计算很粗糙
  • 4、sleep函数稍微延时一下0.1秒可以看清楚效果

最后来一张效果图。。。 4F606A6B-51AC-436D-AE4B-FCBA679B9446

友荐云推荐