Skip to content

Latest commit

 

History

History
50 lines (35 loc) · 1.31 KB

进度条.md

File metadata and controls

50 lines (35 loc) · 1.31 KB

进度条

# 进度条函数
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' 换行,换到下一行的行首。