![对话框和仪表 + yesno 小部件](https://linux22.com/image/37080/%E5%AF%B9%E8%AF%9D%E6%A1%86%E5%92%8C%E4%BB%AA%E8%A1%A8%20%2B%20yesno%20%E5%B0%8F%E9%83%A8%E4%BB%B6.png)
我正在尝试结合一个例子是的,没有小部件来修改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)
- 将选项添加
--stderr
到yesno
小部件(因此它不会干扰实际数据) - 将“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