scripts - ¿Cómo pasar todos los argumentos pasados a mi script de bash a una función mía?
programacion en shell (6)
Digamos que he definido una function abc()
que manejará toda la lógica relacionada con analizar los argumentos pasados a mi script.
¿Cómo puedo pasar todos los argumentos que mi script de bash ha recibido? El número de parámetros es variable, por lo que no puedo simplemente codificar los argumentos pasados de esta manera:
abc $1 $2 $3 $4
Editar Mejor aún, ¿hay alguna forma para que mi función tenga acceso a las variables de los argumentos del script?
Aquí hay un script simple:
#!/bin/bash
args=("$@")
echo Number of arguments: $#
echo 1st argument: ${args[0]}
echo 2nd argument: ${args[1]}
$#
es el número de argumentos recibidos por el script. Encuentro más fácil acceder a ellos usando una matriz: la línea args=("$@")
coloca todos los argumentos en la matriz args
. Para acceder a ellos use ${args[index]}
.
Necesitaba una variación de esto, que espero sea útil para otros:
function diffs() {
diff "${@:3}" <(sort "$1") <(sort "$2")
}
La parte "${@:3}"
significa que todos los miembros de la matriz comienzan en 3. Por lo tanto, esta función implementa un diff ordenado al pasar los primeros dos argumentos a través del ordenamiento y luego pasar todos los otros argumentos a diff, para que pueda llamémoslo similarmente a diff:
diffs file1 file2 [other diff args, e.g. -y]
Un motivo para mascotas: cuando use $@
, debería (casi) siempre ponerlo entre comillas dobles para evitar errores de discusión con espacios en ellos:
abc "$@"
Use la variable $@
, que se expande a todos los parámetros de la línea de comandos separados por espacios.
abc "$@"
Vale la pena mencionar que puede especificar rangos de argumentos con esta sintaxis.
function example() {
echo "line1 ${@:1:1}"; #First argument
echo "line2 ${@:2:1}"; #Second argument
echo "line3 ${@:3}"; #Third argument onwards
}
No lo había visto mencionado.
abc "$@"
$@
representa todos los parámetros dados a su script de bash.