elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Bash script] equivalente de goto en batch para bash (SOLUCIONADO)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Bash script] equivalente de goto en batch para bash (SOLUCIONADO)  (Leído 13,857 veces)
moikano→@


Desconectado Desconectado

Mensajes: 572


Cultiva tu mente y cuerpo, son tu única propiedad


Ver Perfil WWW
[Bash script] equivalente de goto en batch para bash (SOLUCIONADO)
« 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.


« Última modificación: 4 Noviembre 2010, 16:04 pm por moikanolaplana » En línea

Hekaly

Desconectado Desconectado

Mensajes: 85



Ver Perfil WWW
Re: [Bash script] equivalente de goto en batch para bash
« Respuesta #1 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).


« Última modificación: 4 Noviembre 2010, 01:24 am por Leo Gutiérrez. » En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: [Bash script] equivalente de goto en batch para bash
« Respuesta #2 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.  
« Última modificación: 4 Noviembre 2010, 02:05 am por Leo Gutiérrez. » En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
moikano→@


Desconectado Desconectado

Mensajes: 572


Cultiva tu mente y cuerpo, son tu única propiedad


Ver Perfil WWW
Re: [Bash script] equivalente de goto en batch para bash
« Respuesta #3 en: 4 Noviembre 2010, 08:50 am »

Voy a probarlo.
 Gracias por contestar Hekaly y Leo. =)
En línea

moikano→@


Desconectado Desconectado

Mensajes: 572


Cultiva tu mente y cuerpo, son tu única propiedad


Ver Perfil WWW
Re: [Bash script] equivalente de goto en batch para bash
« Respuesta #4 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.
« Última modificación: 18 Diciembre 2010, 21:14 pm por moikano→@ » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines