|
现在我写的 Shell 程序都需要很长、很长的执行时间,于是我需要一个进度条函数,它接收一个整数为参数,作为完成的百分比。使用时需要连续调用,中间不能输出结果。当然,它还需要大量的改进才可以成为“可用的”,但对我的应用来说它已经足够了,所以我就不改进了。并且,现在它是 Bash 脚本,需要修改才可以成为符合 POSIX 标准的 Shell 脚本。样例程序:
- for ((i=0; i < 870; i++)) ; do
- p="$(expr "${i}" \* 100 / 870)"
- progress "${p}"
- done
- echo
复制代码
源程序:
- # progress(int percentage)
- progress()
- {
- test "$1" -gt 100 && return
- local width="$(stty size | awk '{ print $2 }')"
- local strlen="$(echo "$1" | wc | awk '{ print $3 }')"
- local scol=
- local ecol=
- local i=
- local nplus="$(expr \( "${width}" - 13 \) \* "$1" / 100)"
- if ( test "${width}" -ge 4 && test "${width}" -le 13 ) ; then
- scol="$(expr \( "${width}" + 1 \) / 2 - 2)"
- echo -e '\r'
- for ((i=0; i < ${scol}; i++)) ; do
- echo -n ' '
- done
- echo -n "$1%"
- scol="$(expr "${scol}" + "${strlen}" + 1)"
- for ((i=${scol}; i < "${width}"; i++)) ; do
- echo -n ' '
- done
- else
- echo -ne '\r |'
- for ((i=0; i < "${nplus}"; i++)) ; do
- echo -n '+'
- done
- scol="$(expr 5 + "${nplus}")"
- ecol="$(expr "${width}" - 6)"
- for ((i=${scol}; i < "${ecol}"; i++)) ; do
- echo -n '-'
- done
- echo -n '| '
- if test "${strlen}" -eq 1 ; then
- echo -n " $1%"
- elif test "${strlen}" -eq 2 ; then
- echo -n " $1%"
- else
- echo -n " $1%"
- fi
- echo -n ' '
- fi
- }
复制代码 |
|