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:
#!/bin/bash
buscar{
vec=$@
for i in ${vec [* ]};do
echo $i
done
}
buscar
A lo que me retorna esto:
./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.
(1)
la forma de definir una funcion es:
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:
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:
./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:
#!/bin/bash
function buscar {
for i in "$@"; do
echo $i
done
}
buscar "$@"
o, si quieres seguir utilizando la variable vec:
#!/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