2012-09-07 35 views
213

En muchos de los interrogantes y tutoriales de bash que veo que puedo acceder a argumentos de línea de comandos de scripts bash de dos maneras:

$ ~ >cat testargs.sh 
#!/bin/bash 

echo "you passed me" $* 
echo "you passed me" [email protected] 

que se traduce en:

$ ~> bash testargs.sh arg1 arg2 
you passed me arg1 arg2 
you passed me arg1 arg2 

¿Cuál es la diferencia entre $* y [email protected]?
¿Cuándo se debe usar el primero y cuándo se debe usar el último?

+0

eche un vistazo a esta respuesta: http://stackoverflow.com/a/842325/671366 – codeling

+2

@nyarlathotep, gracias, la pregunta es útil. El título es horrible Nunca adivinaría que la respuesta muestra lo que estaba buscando. De alguna manera, mi pregunta es realmente trivial, pero la forma en que la formulé en mi cabeza, no fue fácil de encontrar en el manual bash (aunque/* te lleva al lugar correcto ...) – Oz123

Respuesta

286

La diferencia aparece cuando se citan los parámetros especiales.Permítanme ilustrar las diferencias:

$ set -- "arg 1" "arg 2" "arg 3" 

$ for word in $*; do echo "$word"; done 
arg 
1 
arg 
2 
arg 
3 

$ for word in [email protected]; do echo "$word"; done 
arg 
1 
arg 
2 
arg 
3 

$ for word in "$*"; do echo "$word"; done 
arg 1 arg 2 arg 3 

$ for word in "[email protected]"; do echo "$word"; done 
arg 1 
arg 2 
arg 3 

un ejemplo más de la importancia de citar: tenga en cuenta que hay 2 espacios entre "arg" y el número, pero si no puedo citar $ palabra:

$ for word in "[email protected]"; do echo $word; done 
arg 1 
arg 2 
arg 3 

y en bash, "[email protected]" es la lista "por defecto" para repetir:

$ for word; do echo "$word"; done 
arg 1 
arg 2 
arg 3 
+37

+1 Siempre he pensado que esto El concepto se demostró mejor con un simple ejemplo, en el cual el manual bash está completamente ausente. – chepner

+5

¿Existe un caso de uso posible, cuando '$ *' o '" $ * "' pueden ser necesarios, y el propósito no puede ser servido por '$ @' o '" $ @ "'? – anishsane

+0

Además, ¿hay alguna diferencia entre '$ {arrayname [*]}' vs '$ {arrayname [@]}'? – anishsane

15

$ @ es igual que $ *, pero cada parámetro es una cadena entrecomillada, es decir, los parámetros se transmiten intactos, sin interpretación ni expansión. Esto significa, entre otras cosas, que cada parámetro en la lista de argumentos se ve como una palabra separada.

Por supuesto, "$ @" debe ser citado.

http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST

33

$ *

expande a los parámetros posicionales, empezando por uno. Cuando la expansión se produce entre comillas dobles, se expande a una sola palabra con el valor de cada parámetro separado por el primer carácter de la variable especial IFS. Es decir, "$ *" es equivalente a "$ 1c $ 2c ...", donde c es el primer carácter del valor de la variable IFS. Si IFS no está configurado, los parámetros están separados por espacios. Si IFS es nulo, los parámetros se unen sin separadores intermedios.

$ @

expande a los parámetros posicionales, empezando por uno. Cuando la expansión se produce entre comillas dobles, cada parámetro se expande a una palabra separada . Es decir, "$ @" es equivalente a "$ 1" "$ 2" ... Si se produce la expansión de cotizaciones dobles dentro de una palabra, la expansión del primer parámetro se combina con la parte inicial de la palabra original , y la expansión del último parámetro se combina con la última parte de la palabra original . Cuando no hay parámetros posicionales, "$ @" y $ @ se expanden a nada (es decir, se eliminan).

Fuente: Bash man

148

Un buen ja sft tabla general de la Bash Hackers Wiki:

$* versus $@ table

Si los argumentos son para ser almacenado en una variable guión y se espera que los argumentos para contener espacios, estoy totalmente de recomendar el empleo de un "$*" trick with the internal field separator $IFS set to tab.

+32

... donde "c" es el primer carácter de $ IFS –

+31

... y '$ IFS' significa" separador de campo interno ". –

+0

Aquí hay [un ejemplo] (https://stackoverflow.com/a/4824637/2192488), que incluye entradas entrecomilladas. ¡La entrada también importa! –

Cuestiones relacionadas