【问题标题】:Progress Bar While Looping Script循环脚本时的进度条
【发布时间】:2018-07-10 14:50:28
【问题描述】:

我想在运行以下代码时显示一个进度条。我在这段代码中调用了一个脚本,这可能需要一段时间,具体取决于传入的变量。我尝试了How to add a progress bar to a shell script? 的一些实现,但无法让它们工作。理论上,它应该根据进程是否仍在运行而继续。如果它仍在运行,则显示一个进度条。

cat $BLKUPLD | tr -d '\r' | while read line;
do
device_name=`echo $line | cut -d "," -f 1`
quantity_num=`echo $line | cut -d "," -f 2`
bash $SCRIPT $device_name $quantity_num
done

如果您需要更多信息,请告诉我。

【问题讨论】:

  • 我已经尝试了其中的一些实现,但无法让它们中的任何一个工作。
  • 你有办法知道你的进程什么时候结束吗?如果不是,你希望你的进度条表现如何?
  • 如果你想要更重的界面,你也可以看看zenityHere 是它的一些使用示例。
  • pv替换cat

标签: bash while-loop progress-bar do-loops


【解决方案1】:

下面是一个进度条脚本,它将一直运行直到进度条被填满。

您需要更改最外层 while 循环的条件,以检查您的 $BLKUPLD 是否已完成,并将其余代码移动到指定的 while 循环内(本质上,您可能需要将 MAX_ITERATIONS 更改为布尔值条件,并尝试在此脚手架中插入代码组件的位置)。

理想情况下,您会知道您还有多少剩余数据,并且可以在您进入循环逻辑时相应地动态设置 MAX_ITERATIONS;但是,您提到您也可以使用无限循环的进度条,如果您无法预先定义脚本的终点,这可能是您必须采用的方式。

这个脚本背后的主要前提与我链接的其他线程不同,它没有硬编码的进度点:例如“[###__________]33%”。相反,嵌套的 while 循环用于动态设置主题标签的数量,并动态填充主题标签后的间距以保持一致的进度范围。

#!/bin/sh
MAX_ITERATIONS=10
WHILE_ITERATOR=0
while [ $WHILE_ITERATOR -le $MAX_ITERATIONS ]

# __Add call to process checking script here.__

do
  # Appending hashtags to progress bar string.
  PROGRESS_BAR="["
  HASHTAGS=$WHILE_ITERATOR
  HASHTAGS_ITERATOR=0
  while [ $HASHTAGS_ITERATOR -le $HASHTAGS ]
  do

    # Accounting for first pass through outer loop.
    if [ $WHILE_ITERATOR -eq 0 ]; then
    PROGRESS_BAR+=" #"
    else
    PROGRESS_BAR+="#"
    fi
    HASHTAGS_ITERATOR=$((HASHTAGS_ITERATOR+1))
  done

  # Appending trailing spaces to progress bar string.
  SPACES=$((MAX_ITERATIONS-WHILE_ITERATOR-1))
  SPACES_ITERATOR=0
  while [ $SPACES_ITERATOR -le $SPACES ]
  do
    PROGRESS_BAR+=" "
    SPACES_ITERATOR=$((SPACES_ITERATOR+1))
  done

  # Closing progress bar screen and adding return esc char.
  PROGRESS_BAR+="]\r"

  # Setting echo -n to run properly on Unix & Mac
  if [ "`echo -n`" = "-n" ]; then
  n=""
  c="\c"
  else
  n="-n"
  c=""
  fi

  # Print the progress bar without \n; reprints in place.
  echo $n "$PROGRESS_BAR" $c
  sleep 1
  WHILE_ITERATOR=$((WHILE_ITERATOR+1))
done

# Print final iteration of progress bar string.
echo "$PROGRESS_BAR"

【讨论】:

  • 在哪里有#_Add 调用... 注释是要检查脚本是否正在运行(如在后台运行,运行进度条脚本并检查是否仍在运行)或实际上将脚本的代码放在该部分中,在我的代码中编辑 while 循环以确定是否已读入所有行?如果它们都是合法的方法,哪种方法是最佳做法?
  • 我最初的想法是,您将开始代码以逐行读取,然后启动进度条代码,在#_Add调用注释所在的位置,您将执行您的' listener 函数来检查行读取过程是否完成。如果您这样做了,您可能希望将 while 循环条件更新为“while true”,然后在检查脚本中设置退出逻辑,以便在完成读取行时运行 break [ 0 ]。
猜你喜欢
  • 2015-01-11
  • 2013-03-05
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多