Linux

進度條“對話框”根據函式的命令執行顯示進度

  • December 4, 2021

從函式執行每個回顯命令時,如何使“對話框”進度條增加計數器?

我以下面的程式碼為例,但是在執行來自函式的命令時遇到問題。我可以計算函式中“迴聲”的數量並設置為“項目”,但是如何知道迴聲何時完成以及如何增加條形?

#!/bin/bash
function two() {
  echo "test2-1"; sleep 1;
  echo "test2-2"; sleep 1;
  echo "test2-3"; sleep 1;
  echo "test2-4"; sleep 1;
  echo "test2-5"; sleep 1;
}

(
   items=5
   processed=0
   while [ $processed -le $items ]; do
       pct=$(( $processed * 100 / $items ))
       echo "XXX"
       echo "Processing item $processed" # Here I wish instead $processed
                                         # to be value (test2-1, test2-2 etc.)
                                         # of processed echo
       echo "XXX"
       echo "$pct"
       processed=$((processed+1))
       sleep 3 # Instead of this it should be when echo is finished printing
   done
) | dialog --title "Gauge" --gauge "Wait please..." 10 60 0

一般語法dialog --gauge

這個展示腳本展示瞭如何讓對話框顯示進度。

#!/bin/bash

( echo 10;sleep 1;echo 50;sleep 1; echo 90;sleep 1;echo 100;sleep 1 ) | dialog --gauge 'text' 10 60 0
echo '##########'
i=0; while [ $i -le 100 ];do echo "$i";echo "#comment $i";i=$((i+10));sleep 1;done
echo '##########'
i=0; while [ $i -le 100 ];do echo "$i";echo "#comment $i";i=$((i+10));sleep 1;done| dialog --gauge 'text' 10 60 0
  • 使用數字 0-100 的輸出。
  • 其他輸出可以用#前綴作為註釋,不會混淆dialog。它甚至可能適用於不帶# 前綴的非數字(文本行),但可能會有意外。

如果您有其他輸出,您應該擷取它、處理它並僅將相關值 0-100 傳遞到dialog.

編輯:已知輸出行數

以下腳本在完成之前假定已知數量的輸出行(在此範例中為 5),並使用函式actor來提供dialog

#!/bin/bash

expected_outputs=5
ii=0

function two() {
  echo "test2-1"; sleep 1;
  echo "test2-2"; sleep 1;
  echo "test2-3"; sleep 1;
  echo "test2-4"; sleep 1;
  echo "test2-5"; sleep 1;
}

function actor () {
while read ans
do
   echo "# $ans"
   ii=$((ii+1))
   echo $((ii*100/expected_outputs))
done
}

# main

two | actor

two | actor | dialog --title "Gauge" --gauge "Wait please..." 10 60 0

編輯2:zenity --progress

在圖形桌面環境中,您可以使用以下匹配的命令行zenity

two | actor | zenity --progress --title "Gauge" --text="string" --percentage=0 --auto-close --width=300

引用自:https://unix.stackexchange.com/questions/680136