Shell脚本实现进度条的两种方式

1、脚本中各模块(或函数)运行过程可以量化,则可以直接使用带百分比的进度条。

  1. #!/bin/bash
  2.  
  3. mark=
  4. for ((ratio=0;${ratio}<=100;ratio+=5))
  5. do
  6.          sleep 0.2
  7.          printf “progress:[%-40s]%d%%\r” “${mark}” “${ratio}”
  8.          mark=“##${mark}”
  9. done
  10. echo

如下图,进度条中’#’的数量和进度条长度成正比,printf打印每次只回车不换行,新的异常打印会覆盖之前的打印,执行完成后使用echo换行。

-1

2、有些情况下你也许不知道程序什么时候结束,只是需要一个动态的进度条来表示程序正在运行,比如进度条由[———-]变成[>———],进度条里面的-不断被>替换,当所有的-都被替换后所有符号又重新变成-,直到程序结束运行。

  1. #!/bin/bash
  2.  
  3. trap ‘onCtrlC’ INT
  4. function onCtrlC () {
  5.          #捕获CTRL+C,当脚本被ctrl+c的形式终止时同时终止程序的后台进程
  6.          kill 9 ${do_sth_pid} ${progress_pid}
  7. echo
  8.          echo ‘Ctrl+C is captured’
  9.          exit 1
  10. }
  11.  
  12. do_sth() {
  13.          #运行的主程序
  14.          sleep 10
  15. }
  16.  
  17. progress() {
  18.          #进度条程序
  19.          local main_pid=$1
  20.          local length=20
  21.          local ratio=1
  22.          while [ “$(ps -p ${main_pid} | wc -l)” ne “1” ] ; do
  23.                  mark=‘>’
  24.                  progress_bar=
  25.                  for i in $(seq 1 “${length}”); do
  26.                      if [ “$i” gt “${ratio}” ] ; then
  27.                      mark=‘-‘
  28.                      fi
  29.                      progress_bar=“${progress_bar}${mark}”
  30.                  done
  31.                  printf “Progress: ${progress_bar}\r”
  32.                  ratio=$((ratio+1))
  33.                  #ratio=`expr ${ratio} + 1`
  34.                  if [ “${ratio}” gt “${length}” ] ; then
  35.                      ratio=1
  36.                  fi
  37.                  sleep 0.1
  38.          done
  39. }
  40.  
  41. do_sth &
  42. do_sth_pid=$(jobs | tail 1)
  43.  
  44. progres“${do_sth_pid}” &
  45. progress_pid=$(jobs | tail 1)
  46.  
  47. wait “${do_sth_pid}”
  48. printf “Progress: done \n”

下图是程序运行的几个状态

-2

到此这篇关于Shell脚本实现进度条的两种方式的文章就介绍到这了,更多相关Shell 进度条内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

标签

发表评论