对话框和仪表 + yesno 小部件

对话框和仪表 + yesno 小部件

我正在尝试结合一个例子是的,没有小部件来修改a的输入测量小部件。但它失败了。我的代码是:

#!/bin/bash
PCT=0;i=0
(
while [[ $PCT -le 100 ]]
do
cat <<EOF
XXX
$PCT
el % es ${PCT}
XXX
EOF

for i in 1 2 3 4 5
do
i=$((i+1))
dialog  --yesno "Si o No?" 15 61

case $? in
  0)
    PCT=$(($PCT+20));;
  1)
    PCT=$PCT;;
  255)
    echo "ESC pressed.";;
esac
done
#
#PCT=$(($PCT+10))
sleep 1
done
) |

dialog --title "GAUGE" --gauge "Este es un ejemplo de gauge" 20 70 0

我希望它显示一个yesno对话框,如果用户按下Yes,将 20 添加到PCT,否则PCT保持其值。

请你告诉我如何解决它?

答案1

您可以对脚本进行一些小更改,而不是将yesno小部件放入管道中:

  • 制作一个临时文件,例如 MYPIPE=$(mktemp)
  • 将选项添加--stderryesno小部件(因此它不会干扰实际数据)
  • 将“sleep 1”更改为“echo sleep”(稍后处理)
  • 修改循环的末尾以将数据(现在使用“|”标记通过管道传输)写入此临时文件,并且
  • 在循环之后,执行数据集,在找到“睡眠”时睡眠,否则回显,并通过管道到仪表小部件。

示例如下:

#!/bin/bash
MYPIPE=$(mktemp)
trap "rm -f $MYPIPE" EXIT ERR
PCT=0;i=0

while [[ $PCT -le 100 ]]
do
cat >>$MYPIPE <<EOF
XXX
$PCT
el % es ${PCT}
XXX
EOF

for i in 1 2 3 4 5
do
i=$((i+1))
dialog  --stderr --yesno "$PCT: Si o No?" 15 61

case $? in
  0)
    PCT=$(($PCT+20));;
  255)
    echo "ESC pressed.";;
esac
done

echo sleep >>$MYPIPE
done

while :
do
read MYDATA
[ -z "$MYDATA" ] && break
[ "x$MYDATA" = "xsleep" ] && sleep 1
[ "x$MYDATA" != "xsleep" ] && echo "$MYDATA"
done <$MYPIPE | \
dialog --title "GAUGE" --gauge "Este es un ejemplo de gauge" 20 70 0

相关内容