linux shell进度条

1.最简单的一行进度条

#!/bin/bash num=0 str='' max=100 postfix=('|' '/' '-' '\') while [ $num -le $max ] do let index=num%4 printf "[%-50s %-2d%% %c]\r" "$str" "$num" "${postfix[$index]}" let num++ sleep 0.1 if (($num % 2 == 0)); then str+='#' fi done printf "\n"

效果如下
linux shell进度条
文章图片

原理:
利用printf的\r转译,每次从头输出一个字符串,更新进度条

2.一边输出内容一边更新进度条
#!/bin/bash num=0 str='' max=100 postfix=('|' '/' '-' '\') while [ $num -le $max ] do let index=num%4 shellwidth=`stty size | awk '{print $2}'` shellwidthstr="%-"$shellwidth"s\n" fmt_str="now "$num" shell tty width "$shellwidth printf "$shellwidthstr" "$fmt_str" printf "[%-50s %-2d%% %c]\r" "$str" "$num" "${postfix[$index]}" let num++ sleep 0.1 if (($num % 2 == 0)); then str+='#' fi done printf "\n"

效果如下:
linux shell进度条
文章图片

原理:
printf输出指定长度的字符串,长度用stty size获取,stty size返回高度和宽度
因为进度条以\r转译结束,所以下一次输出会从头输出,如果不输出一行的长度,进度条后面的输出不会刷新丢失
如上例,tty宽度是68,所以应该执行printf "%-68s\n" "$fmt_str"
"%-68s\n"通过shellwidthstr="%-"$shellwidth"s\n"拼接而成
"fmt_str"通过fmt_str="now "$num" shell tty width "$shellwidth拼接而成,这里就是需要自定义输出的内容
【linux shell进度条】

    推荐阅读