1.最简单的一行进度条
#!/bin/bashnum=0
str=''
max=100
postfix=('|' '/' '-' '\')
while [ $num -le $max ]
dolet index=num%4printf "[%-50s %-2d%% %c]\r" "$str" "$num" "${postfix[$index]}"let num++sleep 0.1if (($num % 2 == 0)); thenstr+='#'fi
done
printf "\n"
效果如下
原理:
利用printf的\r转译,每次从头输出一个字符串,更新进度条
2.一边输出内容一边更新进度条
#!/bin/bashnum=0
str=''
max=100
postfix=('|' '/' '-' '\')
while [ $num -le $max ]
dolet index=num%4shellwidth=`stty size | awk '{print $2}'`shellwidthstr="%-"$shellwidth"s\n"fmt_str="now "$num" shell tty width "$shellwidthprintf "$shellwidthstr" "$fmt_str"printf "[%-50s %-2d%% %c]\r" "$str" "$num" "${postfix[$index]}"let num++sleep 0.1if (($num % 2 == 0)); thenstr+='#'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拼接而成,这里就是需要自定义输出的内容