Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: moikano→@ en 3 Noviembre 2010, 21:03 pm



Título: [Bash script] equivalente de goto en batch para bash (SOLUCIONADO)
Publicado por: moikano→@ en 3 Noviembre 2010, 21:03 pm
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
  1. #!/bin/bash -x
  2. while [ $SALIR=1 ] ; do
  3.    read -p 'indica lo que quieres hacer
  4.              1) un ls 2) un ipconfig 3) Salir ' ata ;
  5.          case $ata in
  6.             1) gnome-terminal -x bash -c "ls|less" ;;
  7.             2) gnome-terminal -x bash -c "ipconfig" ;;
  8.             3) $SALIR=2 ;;
  9.             *) echo 'lo escrito no es correcto'
  10.          esac
  11.    done
  12. read -p 'pulsa intro para salir'
  13.  

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.


Título: Re: [Bash script] equivalente de goto en batch para bash
Publicado por: Hekaly en 4 Noviembre 2010, 00:04 am
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.

Código:
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
  1. #!/bin/bash -x
  2.  
  3. function menu() {
  4. while [ $SALIR=1 ] ; do
  5.    read -p 'indica lo que quieres hacer
  6.              1) un ls 2) un ipconfig 3) Salir ' ata ;
  7.          case $ata in
  8.             1) gnome-terminal -x bash -c "ls|less" ; menu;;
  9.             2) gnome-terminal -x bash -c "ipconfig" ; menu;;
  10.             3) $SALIR=2 ;;
  11.             *) echo 'lo escrito no es correcto'
  12.          esac
  13.    done
  14. read -p 'pulsa intro para salir'
  15. }
  16.  
  17. 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).


Título: Re: [Bash script] equivalente de goto en batch para bash
Publicado por: leogtz en 4 Noviembre 2010, 01:42 am
Código
  1. #!/bin/bash
  2. # Menu de opciones con select
  3. OPCIONES="Hola Lala Salir"
  4. select opt in $OPCIONES;
  5. do
  6. if [ "$opt" = "Hola" ]
  7. then
  8. echo -e "Hola";
  9. elif [ "$opt" = "Lala" ]
  10. then
  11. echo -e "Lala";
  12. elif [ "$opt" = "Salir" ]
  13. then
  14. echo -e "Has salido";
  15. exit 0;
  16. else
  17. echo -e "Opción errónea";
  18. fi
  19. done
  20.  
  21.  
  22.  

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
  1. #!/bin/bash
  2. # Menu de opciones con select
  3. OPCIONES="Hola Lala Salir"
  4. select opt in $OPCIONES;
  5. do
  6. case "$opt" in
  7. "Hola")
  8. echo -e "Hola";
  9. break;
  10. ;;
  11. "Lala")
  12. echo -e "Lala";
  13. break;
  14. ;;
  15. "Salir")
  16. echo -e "Salir";
  17. exit 0;
  18. ;;
  19. *)
  20. echo -e "Opcion erronea";
  21. ;;
  22. esac
  23. done
  24.  
  25. echo -e "Continua";
  26.  


Título: Re: [Bash script] equivalente de goto en batch para bash
Publicado por: moikano→@ en 4 Noviembre 2010, 08:50 am
Voy a probarlo.
 Gracias por contestar Hekaly y Leo. =)


Título: Re: [Bash script] equivalente de goto en batch para bash
Publicado por: moikano→@ en 4 Noviembre 2010, 15:58 pm
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
  1. #!/bin/bash -x
  2. while [ $SALIR=1 ] ; do
  3.    read -p 'indica lo que quieres hacer
  4.              1) un ls 2) un ipconfig 3) Salir ' ata ;
  5.          case $ata in
  6.             1) gnome-terminal -x bash -c "ls|less" ;;
  7.             2) gnome-terminal -x bash -c "ipconfig" ;;
  8.             [color=red]3) Break ;;[/color]
  9.             *) echo 'lo escrito no es correcto'
  10.          esac
  11.    done
  12. 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.