[SOLUCIONADO] Funciones con parámetros bash

Iniciado por phr4ckl0t, Septiembre 14, 2016, 10:13:53 PM

Tema anterior - Siguiente tema

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

Septiembre 14, 2016, 10:13:53 PM Ultima modificación: Septiembre 15, 2016, 08:16:22 PM por rollth
Hola muchachos una vez mas, espero estén bien.
Hoy vengo con una duda en bash sobre las funciones, sucede que estoy practicando y necesito manejar una lista de parámetros en el script.
Estoy haciendo un ejercicio que dice que al script le debo pasar un comando y el me retorna la ubicación del comando dentro de los directorios de $PATH, pero el problema es a la hora de pasarle varios parametros. Para tener una idea de como manejar el array con los comandos pasados estaba probando esto:

Código: bash
#!/bin/bash
buscar{
   vec=$@
   for i in ${vec [* ]};do
      echo $i
      done
}
buscar


A lo que me retorna esto:

Código: bash
./script uno dos ( lo que pongo yo en la terminal )

./script: línea 3: buscar{: orden no encontrada
uno
dos
./script: línea 9: error sintáctico cerca del elemento inesperado `}'
./script: línea 9: `}'

He probado poniendo function buscar () { ... , buscar(){ ... pero así ni siquiera imprime lo que yo le paso como parámetro
Una manito me sentaría muy bien jeje, disculpen las molestias.

Septiembre 15, 2016, 12:50:25 AM #1 Ultima modificación: Septiembre 15, 2016, 02:17:00 AM por grep
(1)
la forma de definir una funcion es:

Código: text

function <nombre> {
  ...
}


observa que no hay paréntesis en la definición.

(2)
Si utilizas $@ dentro de una función, entonces $@ hace referencia a los parámetros de la función y no los parámetros del script. Si quieres acceder a los parámetros pasados al script, dentro de la función, entonces debes pasar $@ como parámetro:

Código: bash
buscar $@


(3)
Es mejor que utilices "$@" y no $@. Cuando haces "$@", esto es igual a "$1" "$2" "$3"... . Por el otro lado, $@ se expande a $1 $2 $3 ... , osea que los parámetros no se enuentran entre comillas, y eso puede llevar a resultados no deseados con parámetros que se encuentren entre comillas. Por ejemplo, si suponemos que ejecutamos un script con parámetros de la siguiente forma:

Código: bash

./script a "b c"


con "$@" se expande a:
a y b c

pero con $@ se expande a:
a y b y c

el cual no suele ser el resultado deseado.


El siguiente tiene en cuenta lo anteriormente dicho:

Código: bash

#!/bin/bash

function buscar {
  for i in "$@"; do
    echo $i
  done
}

buscar "$@"


o, si quieres seguir utilizando la variable vec:

Código: bash

#!/bin/bash

function buscar {
  vec=("$@")
  for i in "${vec[@]}"; do
    echo $i
  done
}

buscar "$@"


Saludos

Muchas gracias hermano, de verdad que me resultó útil tu respuesta, ahora ya puedo seguir :D  :D