![进度条“对话框”显示基于函数命令执行的进度](https://linux22.com/image/199219/%E8%BF%9B%E5%BA%A6%E6%9D%A1%E2%80%9C%E5%AF%B9%E8%AF%9D%E6%A1%86%E2%80%9D%E6%98%BE%E7%A4%BA%E5%9F%BA%E4%BA%8E%E5%87%BD%E6%95%B0%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E7%9A%84%E8%BF%9B%E5%BA%A6.png)
当从函数执行每个 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