Como reconhecer respostas SIM ou NÃO no Dialog

A forma mais básica de se comunicar com o usuário é fazendo perguntas que ele possa responder com Sim ou Não. É possível fazer um configurador, ou até mesmo um programinha simples com essas respostas. Já foi visto como fazer uma telinha desse tipo:

dialog --yesno 'sim ou não?' 0 0

Mas, e dentro de um script, como saber qual foi a resposta do usuário? Qual foi o botão que ele apertou?

O Dialog utiliza o código de retorno (“Return Code“) para informar qual foi o botão apertado. Como sabemos, o shell guarda esse código dentro da variável $?.

Então que tal descobrirmos a solução do problema testando? Execute o seguinte comando duas vezes, e note qual o código de retorno que aparece quando se escolhe “Yes” e quando se escolhe “No”.

dialog --yesno 'sim ou não?' 0 0 ; echo Retorno: $?

simnao

Fácil! Zero para Sim, um para não.

Se lembrarmos que todos os comandos UNIX/Linux retornam zero em sucesso e qualquer coisa diferente de zero (geralmente 1) quando ocorre algum erro, fica fácil memorizar. O zero é sempre positivo, beleza, sem erro, SIM. O um é problema, erro, NÃO.

Memorizando: SIM=0, NÃO=1

Agora que sabemos isso, fica fácil lidar com as respostas do usuário. Basta usar o if para testar o valor do $?. Um exemplo bem simples:

dialog --yesno 'Quer ver as horas?' 0 0

if [ $? = 0 ]; then
	echo "Agora são: $( date )"
else
	echo 'Ok, não vou mostrar as horas.'
fi

Caso a mensagem do else não seja necessária, podemos usar o operador && (AND) e deixar o comando bem mais simples:

dialog --yesno 'Quer ver as horas?' 0 0 && echo "Agora são: $(date)"

horas

Usando o Dialog fica fácil definir variáveis de estado (“flags“) ou opções antes da execução de um programa! Por exemplo, um programa simples para listar arquivos do diretório atual:

#!/bin/sh
# lsj.sh -- o script do "ls joiado"
# DWS Analista de Sistemas

# Zerando as opções
cor= ; ocultos= ; subdir= ; detalhes=

# Obtendo as configurações que o usuário deseja
dialog --yesno 'Usar cores?'               0 0 && cor='--color=yes'
dialog --yesno 'Mostrar arquivos ocultos?' 0 0 &&  ocultos='-a'
dialog --yesno 'Incluir sub-diretórios?'   0 0 &&   subdir='-R'
dialog --yesno 'Mostrar visão detalhada?'  0 0 && detalhes='-l'

# Mostrando os arquivos
ls $cor $ocultos $subdir $detalhes