LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1236|回复: 1

Progress Bar in Shell

[复制链接]
发表于 2006-4-17 18:36:00 | 显示全部楼层 |阅读模式
现在我写的 Shell 程序都需要很长、很长的执行时间,于是我需要一个进度条函数,它接收一个整数为参数,作为完成的百分比。使用时需要连续调用,中间不能输出结果。当然,它还需要大量的改进才可以成为“可用的”,但对我的应用来说它已经足够了,所以我就不改进了。并且,现在它是 Bash 脚本,需要修改才可以成为符合 POSIX 标准的 Shell 脚本。样例程序:

  1. for ((i=0; i < 870; i++)) ; do
  2.     p="$(expr "${i}" \* 100 / 870)"
  3.     progress "${p}"
  4. done

  5. echo
复制代码


源程序:

  1. # progress(int percentage)
  2. progress()
  3. {
  4.     test "$1" -gt 100 && return
  5.     local width="$(stty size | awk '{ print $2 }')"
  6.     local strlen="$(echo "$1" | wc | awk '{ print $3 }')"
  7.     local scol=
  8.     local ecol=
  9.     local i=
  10.     local nplus="$(expr \( "${width}" - 13 \) \* "$1" / 100)"
  11.     if ( test "${width}" -ge 4 && test "${width}" -le 13 ) ; then
  12.         scol="$(expr \( "${width}" + 1 \) / 2 - 2)"
  13.         echo -e '\r'
  14.         for ((i=0; i < ${scol}; i++)) ; do
  15.             echo -n ' '
  16.         done
  17.         echo -n "$1%"
  18.         scol="$(expr "${scol}" + "${strlen}" + 1)"
  19.         for ((i=${scol}; i < "${width}"; i++)) ; do
  20.             echo -n ' '
  21.         done
  22.     else
  23.         echo -ne '\r  |'
  24.         for ((i=0; i < "${nplus}"; i++)) ; do
  25.             echo -n '+'
  26.         done
  27.         scol="$(expr 5 + "${nplus}")"
  28.         ecol="$(expr "${width}" - 6)"
  29.         for ((i=${scol}; i < "${ecol}"; i++)) ; do
  30.             echo -n '-'
  31.         done
  32.         echo -n '| '
  33.         if test "${strlen}" -eq 1 ; then
  34.             echo -n "   $1%"
  35.         elif test "${strlen}" -eq 2 ; then
  36.             echo -n "  $1%"
  37.         else
  38.             echo -n " $1%"
  39.         fi
  40.         echo -n '  '
  41.     fi
  42. }
复制代码
发表于 2006-4-25 21:35:28 | 显示全部楼层
Post by herberteuler
现在我写的 Shell 程序都需要很长、很长的执行时间,于是我需要一个进度条函数,它接收一个整数为参数,作为完成的百分比。使用时需要连续调用,中间不能输出结果。当然,它还需要大量的改进才可以成为“可用的”,但对我的应用来说它已经足够了,所以我就不改进了。并且,现在它是 Bash 脚本,需要修改才可以成为符合 POSIX 标准的 Shell 脚本。样例程序:
……

呵呵!先收藏起来,有机会再看看。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表