# 进度条函数
bar() {
# 用法: bar 1 10
# ^----- 已经完成的百分比 (0-100).
# ^--- 字符总长度.
((elapsed=$1*$2/100))
# 创建空格表示的进度条
printf -v prog "%${elapsed}s"
printf -v total "%$(($2-elapsed))s"
printf '%s\r' "[${prog// /-}${total}]"
}
# 进度条使用示例
for ((i=0;i<=100;i++)); do
# 纯粹的暂停动作 (为了本例可以更好的演示).
(:;:) && (:;:) && (:;:) && (:;:) && (:;:)
# Print the bar.
bar "$i" "10"
done
printf '\n'
语法说明:
((elapsed=$1*$2/100))
- (( ))的作用是重定义括号中的变量值,此处是计算已经完成的占总字符的长度;
printf -v prog "%${elapsed}s"
"%${elapsed}s"
此处%%ns
表示指定输出字符串长度,如果不够,空格补全,次数会输出指定个数的空格;printf -v
把输出作为一个变量,使用-v var
格式。
'%s\r'
- '\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;
- '\n' 换行,换到下一行的行首。