[Bash script] equivalente de goto en batch para bash (SOLUCIONADO)

Iniciado por moikano→@, 3 Noviembre 2010, 21:03 PM

0 Miembros y 1 Visitante están viendo este tema.

moikano→@

Como estoy empezando con bash y con batch voy un poco mas adelantado aveces tengo el problema de que se hacer una cosa en batch que me gustaría hacerla en bash pero no se como, esta es una de ellas.
E leido por ahí de que no existe una función para bash que se parezca a la de goto de batch, pero pregunto por si hay algo parecido que sea así de sencillo de usar.
Como es un bucle (lo del goto) imagine que se podría hacer lo mismo en bash pero con un bucle, es decir usando while o until (en mi caso while) así que e estado probando con los bucles, pero sin solución.

Acudo a vosotros oh! sabios del script, para que deshagáis mis dudas en mil pedazos. =)

Agrego el código:
Código (bash) [Seleccionar]

#!/bin/bash -x
while [ $SALIR=1 ] ; do
   read -p 'indica lo que quieres hacer
             1) un ls 2) un ipconfig 3) Salir ' ata ;
         case $ata in
            1) gnome-terminal -x bash -c "ls|less" ;;
            2) gnome-terminal -x bash -c "ipconfig" ;;
            3) $SALIR=2 ;;
            *) echo 'lo escrito no es correcto'
         esac
   done
read -p 'pulsa intro para salir'


Lo que pretendo es que se repita el menú "case" hasta que le de a salir, y entonces salga del bucle.

El error que me da es el siguiente:

línea 8: =2: orden no encontrada

Supongo que es que estoy añadiendo mal el 2 a la variable $SALIR pero es que e probado de todas las formas que se me han ocurrido y no logro que salga bien, o bien no me entra en el bucle o bien no me sale.

Hekaly

#1
la primera forma que me viene a la cabeza para hacer el buble (volver a mostrar el menu) en bash es creando una funcion de la siguiente forma.

funtion nombre_funcion() { codigo}

Para llamar a la funcion, escribiremos el nombre de la misma en la parte de codigo que nesesitemos. Tomando tu ejemplo podria ser una cosa así.

Código (bash) [Seleccionar]
#!/bin/bash -x

function menu() {
while [ $SALIR=1 ] ; do
   read -p 'indica lo que quieres hacer
             1) un ls 2) un ipconfig 3) Salir ' ata ;
         case $ata in
            1) gnome-terminal -x bash -c "ls|less" ; menu;;
            2) gnome-terminal -x bash -c "ipconfig" ; menu;;
            3) $SALIR=2 ;;
            *) echo 'lo escrito no es correcto'
         esac
   done
read -p 'pulsa intro para salir'
}

menu


Si te fijas si apretas una de las opciones realizara la primera orden y despues llamará de nuevo el menu para usarlo otra vez.

Del mismo modo con las funciones en linux le puedes pasar parametros.(equivalente al comando call en batch).

leogtz

#2
Código (bash) [Seleccionar]
#!/bin/bash
# Menu de opciones con select
OPCIONES="Hola Lala Salir"
select opt in $OPCIONES;
do
if [ "$opt" = "Hola" ]
then
echo -e "Hola";
elif [ "$opt" = "Lala" ]
then
echo -e "Lala";
elif [ "$opt" = "Salir" ]
then
echo -e "Has salido";
exit 0;
else
echo -e "Opción errónea";
fi
done
         



En vez del condicional IF, se podría usar un case.

En bash no hay goto, pero se puede sustituir facilmente con llamadas a funciones y loops.

Código (bash) [Seleccionar]

#!/bin/bash
# Menu de opciones con select
OPCIONES="Hola Lala Salir"
select opt in $OPCIONES;
do
case "$opt" in
"Hola")
echo -e "Hola";
break;
;;
"Lala")
echo -e "Lala";
break;
;;
"Salir")
echo -e "Salir";
exit 0;
;;
*)
echo -e "Opcion erronea";
;;
esac
done

echo -e "Continua";
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

moikano→@

Voy a probarlo.
Gracias por contestar Hekaly y Leo. =)

moikano→@

#4
Los he probado todos y en un principio todos sirven (unos van mejor que otros) pero me he dado cuenta mientras los probaba que el fallo en mi código era la forma de salir del bucle. Lo único que me faltaba era cambiar el "SALIR=2" por un simple "break", así que al final me quedo con el código del principio que expuse pero con ese retoque. Aquí lo adjunto:

Código (bash) [Seleccionar]

#!/bin/bash -x
while [ $SALIR=1 ] ; do
   read -p 'indica lo que quieres hacer
             1) un ls 2) un ipconfig 3) Salir ' ata ;
         case $ata in
            1) gnome-terminal -x bash -c "ls|less" ;;
            2) gnome-terminal -x bash -c "ipconfig" ;;
            [color=red]3) Break ;;[/color]
            *) echo 'lo escrito no es correcto'
         esac
   done
read -p 'pulsa intro para salir'


Lo que está en rojo era el fallo retocado del primer codigo.

Ah! y por cierto, ya se que el "goto" no existe en batch pero si de los 4 códigos que se han expuesto tendría que decir el que mas se parece creo que sería el de Hekaly con la rellamada a la función.