循环脚本时的进度栏

时间:2018-07-10 14:50:29

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

我想在运行以下代码时显示进度条。我正在这段代码中调用一个脚本,该脚本可能需要一段时间,具体取决于传入的变量。我已经尝试了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

如果您需要其他信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

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

您将要更改最外面的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"