2010-09-28 11 views
369

Digamos que he definido una función abc() que manejará toda la lógica relacionada con el análisis de los argumentos pasados ​​a mi script.¿Cómo pasar todos los argumentos pasados ​​a mi script bash a una función mía?

¿Cómo puedo pasar todos los argumentos que mi script bash ha recibido? El número de params es variable, por lo que no sólo puede codificar los argumentos que se pasan de esta manera:

abc $1 $2 $3 $4 

edición: Mejor aún, ¿hay alguna manera de que mi función para tener acceso a las variables de los argumentos del script?

+5

posible duplicado de [Pasar TODOS los argumentos de Bash Script a otro comando] (http://stackoverflow.com/questions/3190818/pass-all-arguments-from-bash-script-to-another-command) – Urda

Respuesta

599

cosas que me molestan: cuando se utiliza [email protected], usted debe (casi) siempre ponerlo entre comillas para evitar misparsing de discusión con espacios en ellos:

abc "[email protected]" 
+8

¿Eso no funciona solo para 1 argumento?Si tiene múltiples argumentos, ¿no se pasará como una cadena larga? – hepcat72

+58

@ hepcat72 No. '" $ * "' funciona de la forma que usted describe, pero '" $ @ "' es manejado como un caso especial por el shell. De [el manual de referencia de bash, sección de parámetros especiales] (http://www.gnu.org/software/bash/manual/bash.html#Special-Parameters): '@ ... Se expande a los parámetros posicionales, comenzando por uno. Cuando la expansión ocurre entre comillas dobles, cada parámetro se expande a una palabra separada. Es decir, "$ @" es equivalente a "$ 1" "$ 2" ... ' –

+3

Si desea pasar * todos menos los primeros * argumentos, primero puede usar 'shift' para" consumir "el primer argumento, luego pase' $ @ ', la lista de argumentos restantes a otro comando – rubo77

38

Aquí es un simple script:

#!/bin/sh 

args=("[email protected]") 

echo Number of arguments: $# 
echo 1st argument: ${args[0]} 
echo 2nd argument: ${args[1]} 

$# es el número de argumentos recibidos por el guión. Me resulta más fácil acceder a ellos utilizando una matriz: la línea args=("[email protected]") pone todos los argumentos en la matriz args. Para acceder a ellos, use ${args[index]}.

+3

sería '$ {args [0]}' para el primer argumento: o – King

+0

Gracias. ¡Muy útil! –

+3

¿Qué beneficio proporciona pasar $ @ a una matriz sobre simplemente llamar los argumentos por índice (por ejemplo, $ 1)? – Kingand

109

necesitaba una variante de este, que espero será útil para otros:

function diffs() { 
     diff "${@:3}" <(sort "$1") <(sort "$2") 
} 

el "${@:3}" parte significa que todos los miembros de la matriz a partir de 3. Así que esta función implementa un diff ordenada haciendo pasar los primeros dos argumentos para diff través de especie y luego pasar el resto de una rguments para ver las diferencias, por lo que se le puede llamar de manera similar a diff:

diffs file1 file2 [other diff args, e.g. -y] 
+10

El '" $ {@: 3} "' también es excelente cuando tienes scripts que tienen argumentos, pero también pueden pasar argumentos a otros scripts a los que llaman. Por ejemplo, un proyecto mío tiene una secuencia de comandos para ejecutar el programa fácilmente, con un argumento para que la clase principal use. Luego '' $ {@: 2} "' se puede usar para pasar los argumentos restantes a ese punto de entrada. – Kat

+4

@Kat ya lo mencionó, pero para aclarar (en caso de que todavía tenga dudas): 'command" $ @ "' es equivalente a 'command $ 1" $ {@: 2} "'. – Mahn

19

Vale la pena mencionar que se puede especificar el argumento oscila 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 mencionar.

+1

Puedes simplemente usar '$ 1',' $ 2', ... para los primeros dos – rubo77

+0

@ rubo77 He corregido la redacción de mi respuesta para incluir "rango" gracias. – robstarbuck

Cuestiones relacionadas