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"
效果如下
文章图片
原理:
利用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"
效果如下:
文章图片
原理:
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进度条】
推荐阅读
- web|HW蓝队面试题(初级)
- linux之chattr命令
- Linux 有多种少发行版(真可谓百花齐放)
- Linux - route命令
- Linux需巧学
- 佳豪哥哥教你学Linux的第十四天
- 网络研究院|无法访问mysql官网,如何查找下载mysql所有版本?
- centos|Not Found-The requested URL was not found on this server.
- Linux之ssh-add命令