进度条“对话框”显示基于函数命令执行的进度

进度条“对话框”显示基于函数命令执行的进度

当从函数执行每个 echo 命令时,如何使“对话框”进度条增加计数器?

我有下面的代码作为示例,但我在执行函数命令时遇到捕获问题。我可以计算函数中“echo”的数量并将其设置为“items”,但是如何知道echo何时完成以及如何增加栏?

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

答案1

一般语法为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进行 feed 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

相关内容