Linux/Unix Shell Scripting - Menu con pregunta de confirmacion

 
Vista:
sin imagen de perfil

Menu con pregunta de confirmacion

Publicado por Fer (21 intervenciones) el 13/11/2013 19:52:45
Hola, buenas.
Intentando mejorar un poco el script con el que trabajo me gustaria que despues de elegir una opcion me pidiera confirmacion de que es correcta y si no lo es me preguntara de nuevo recargando el menu. Para ello y sin saber si es el modo correcto (yo solo se algo de vba) he visto que se pueden hacer funciones, asi que he metido el bucle while en una funcion:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/bin/bash
PAIS=""
# Declaramos el procedimiento del menu como funcion
menu ()
{
clear
while :
do
echo " Escoja el pais al que pertenece la lista de emails a  tratar "
echo "1. Afghanistán(AF) "
echo "2. Albania(AL) "
echo "3. Alemania(DE) "
 
Etc, etc.....
 
echo "245. Zaire (Congo)(ZR) "
echo "246. Zambia(ZM) "
echo "247. Zimbabwe(ZW) "
echo "248. SALIR "
 
echo -n "Seleccione una opcion [1 - 247] o 248 para salir: "
read opcion
case $opcion in
# Sustituimos la linea correspondiente en "ClasificaEmails.sh" y despues llamamos al script
1) sed -i '/# Linea de sustitucion/ cs/\\.af$/T/I # Linea de sustitucion' ClasificaEmails.sh;break;;
2) sed -i '/# Linea de sustitucion/ cs/\\.al$/T/I # Linea de sustitucion' ClasificaEmails.sh;break;;
3) sed -i '/# Linea de sustitucion/ cs/\\.de$/T/I # Linea de sustitucion' ClasificaEmails.sh;break;;
 
Etc, etc....
 
245) sed -i '/# Linea de sustitucion/ cs/\\.zr$/T/I # Linea de sustitucion' ClasificaEmails.sh;break;;
246) sed -i '/# Linea de sustitucion/ cs/\\.zm$/T/I # Linea de sustitucion' ClasificaEmails.sh;break;;
247) sed -i '/# Linea de sustitucion/ cs/\\.zw$/T/I # Linea de sustitucion' ClasificaEmails.sh;break;;
248) exit;;
*) echo "$opcion es una opcion invalida.";
echo "Presione enter para continuar";
read foo;;
esac
done
}
 
# Llamamos al menu
menu
 
# Mostramos la opcion elegida para pedir confirmacion de la misma
PAIS=$(grep -h -m1 "$opcion" Menu.sh | sed -e 's/echo \"//;s/ \"//')
echo -n "Confirme que $PAIS es el pais correcto [ s / n ]"
read CONFIRMA
case "$CONFIRMA" in
s) echo "Escribiste -si- y nos vamos a procesar" ;exit;;
n) echo "Escribiste -no- regresamos al menu para elegir pais de nuevo"
menu ;;
*) echo "Debe presionar s o n para continuar." ;;
esac
 
echo "Nunca deberia llegar aqui"
exit
clear
./ClasificaEmails.sh

Al pulsar "n" regresa al menu, pero despues de seleccionar una nueva opcion (de pais) salta directamente despues del ultimo esac he imprime "Nunca deberia llegar aqui".
Ademas si CONFIRMA es diferente de s o n tambien sale al pulsa una tecla en lugar de regresar a esperar la s o n.
En fin que no me entero de como funciona esto por mucho que repase tema.
Gracias por adelantado a cualquier ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Menu con pregunta de confirmacion

Publicado por Tom (361 intervenciones) el 14/11/2013 09:05:40
1
2
3
4
5
6
7
8
9
10
11
12
# Mostramos la opcion elegida para pedir confirmacion de la misma
PAIS=$(grep -h -m1 "$opcion" Menu.sh | sed -e 's/echo \"//;s/ \"//')
echo -n "Confirme que $PAIS es el pais correcto [ s / n ]"
read CONFIRMA
case "$CONFIRMA" in
s) echo "Escribiste -si- y nos vamos a procesar" ;exit;;
n) echo "Escribiste -no- regresamos al menu para elegir pais de nuevo"
menu ;;
*) echo "Debe presionar s o n para continuar." ;;
esac
 
echo "Nunca deberia llegar aqui"

Piensa en la lógica del código que has escrito:
- pides CONFIRMA
- si CONFIRMA es si haces exit (rompes el flujo de programa de esta función)
-- pero --
- si CONFIRMA es no llamas a menu y continúas
- si CONFIRMA es cualquier otra cosa sacas mensaje y continúas
- haces el echo "Nunca debería ... "

En realidad lo que quieres hacer es volver a pedir CONFIRMA cuando no es ni si ni no, no simplemente continuar ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Menu con pregunta de confirmacion

Publicado por Fer (21 intervenciones) el 14/11/2013 10:39:19
Hola,
Gracias por la respuesta, me ha ayudado mucho a ver lo que tenia mal y lo que faltaba :-).
La parte final queda asi y parece funcionar bien:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Llamamos al menu
menu
 
# Mostramos la opcion elegida para pedir confirmacion de la misma
PAIS=$(grep -h -m1 "$OPCION" Menu.sh | sed -e 's/echo \"//;s/ \"//')
while :
do
echo -n "Confirme que $PAIS es el pais correcto [ s / n ] "
read CONFIRMA
case $CONFIRMA in
s) break;;
n) menu;;
*) echo "$OPCION es una opcion invalida.";
   echo "Presione Enter para continuar.";
read foo;;
esac
done
 
# Exportamos la opcion del pais
export PAIS=$PAIS
clear
./ClasificaEmails.sh

Espro le pueda servir de ayuda a alguien mas.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Menu con pregunta de confirmacion

Publicado por Fer (21 intervenciones) el 14/11/2013 11:17:16
Habia un par de errores y he ñadido color a la opcion:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Llamamos al menu
menu
 
# Mostramos la opcion elegida para pedir confirmacion de la misma
PAIS=$(grep -h -m1 "$OPCION" Menu.sh | sed -e 's/echo \"//;s/ \"//')
while :
do
 
# Ponemos pais de color verde
echo -ne "Confirme que \e[1;32m$PAIS\e[m\e[1;37\e[m es el pais correcto [ s / n ] "
read CONFIRMA
case $CONFIRMA in
s) break;;
n) menu;;
*) echo "$CONFIRMA es una opcion invalida.";;
esac
done
 
# Exportamos la opcion del pais
export PAIS=$PAIS
clear
./ClasificaEmails.sh
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Menu con pregunta de confirmacion

Publicado por Tom (361 intervenciones) el 14/11/2013 20:34:58
Podrías echar un ojo al comando select, generalmente disponible con bash, que quizás te ayude algo para los menús.

O mejor aún a dialog que te permite hacer esas "pantallas" con fondo azul que habrás visto más de una vez en herramientas de consola en linux ...

Tiene un montón de "controles" predefinidos y configurables.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Menu con pregunta de confirmacion

Publicado por Fer (21 intervenciones) el 14/11/2013 20:45:44
Hola,
buena info, no tenia ni idea de que existia dicha herramienta.
Select ya lo conozco algo, pero aun estoy muy verde en shell, y mas saliendo de vba (que tambien soy novato pero ya he programado cosas algo complejas) que llegas aqui con algunos "vicios" :-).
Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Menu con pregunta de confirmacion

Publicado por Tom (361 intervenciones) el 14/11/2013 21:30:15
dialog es un pelin engorroso, pero mucho menos que hacer los menús "a mano":

1
2
3
ls /usr/share/zoneinfo/Europe/ >/tmp/l1
dialog --no-tags --menu "Europe Timezones" 0 0 0 $(paste /tmp/l1 /tmp/l1) 2>sal
[ -s sal ] && echo "Elegiste $(cat sal)" || echo "Cancelaste el proceso"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar