Bash 循环脚本时的进度条

Bash 循环脚本时的进度条,bash,while-loop,progress-bar,do-loops,Bash,While Loop,Progress Bar,Do Loops,我想在运行以下代码时显示一个进度条。我在这段代码中调用一个脚本,根据传入的变量可能需要一段时间。我已经尝试了来自的一些实现,但未能使它们正常工作。理论上,它应该根据进程是否仍在运行而继续。如果仍在运行,则显示进度条 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 $S

我想在运行以下代码时显示一个进度条。我在这段代码中调用一个脚本,根据传入的变量可能需要一段时间。我已经尝试了来自的一些实现,但未能使它们正常工作。理论上,它应该根据进程是否仍在运行而继续。如果仍在运行,则显示进度条

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

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

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

您需要更改最外层while循环的条件,以检查$BLKUPLD是否已完成,并将其余代码移动到while循环中指定的位置(本质上,您可能需要将MAX_迭代次数更改为布尔条件,并在该框架中插入代码组件的位置)

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

与我链接的其他线程不同的是,此脚本背后的主要前提是没有硬编码的进度点:例如“[####(u#)(u#)]33%”。相反,嵌套的while循环用于动态设置hashtag的数量,并动态填充hashtag后面的间距,以保持一致的进度跨度

#!/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"

可能重复我已经尝试了其中的一些实现,但无法让它们中的任何一个正常工作。您有办法知道您的过程何时结束吗?如果没有,你希望你的进度条表现如何?如果你想要更重的界面,你也可以看看
zenity
。下面是它的一些使用示例。在有##u Add调用的地方,将
cat
替换为
pv
。。。注释您的意思是检查脚本是否正在运行(如在后台一样,运行进度条脚本并检查是否仍在运行),还是实际将脚本的代码放在该部分中编辑代码中的while循环以确定是否已读入所有行?如果它们都是合法的方法,那么哪一种是最佳做法?我最初的想法是,您将启动代码以逐行读取,然后启动进度条形码,在##u Add call注释所在的位置,您将执行“listener”函数以检查行读取过程是否完成。如果这样做,您可能希望将while循环条件更新为“while true”,然后在检查脚本中设置退出逻辑,以便在完成读取行时运行break[0]。