caixa de diálogo e medidor + widget yesno

2

Estou tentando um exemplo de combinação de um widget yesno para modificar a entrada de um widget gauge . Mas isso falha. Meu código é:

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

Eu quero exibir um diálogo yesno , onde se o usuário pressionar Yes , ele adicionará 20 a PCT , caso contrário, PCT manterá seu valor.

Por favor, você poderia me dizer como corrigi-lo?

    
por sebelk 23.05.2014 / 00:33

1 resposta

1

Em vez de colocar o widget yesno no canal, você pode fazer algumas pequenas alterações no script:

  • cria um arquivo temporário, por exemplo, %código%
  • adicione a opção MYPIPE=$(mktemp) ao widget --stderr (para que não interfira nos dados reais)
  • altere o "sleep 1" para "echo sleep" (será processado posteriormente)
  • modificar o final do loop para gravar os dados (que agora são canalizados usando a marca "|") para esse arquivo temporário e
  • após o loop, execute o conjunto de dados, dormindo quando "dormir" for encontrado ou fazendo eco de outra forma e canalizando esse para o widget de medidor.

Um exemplo segue:

#!/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
    
por 28.10.2015 / 01:44

Tags