2010-05-03 14 views
39

En scripts de shell, ¿cuál es la diferencia entre [email protected] y $*?

¿Cuál es la forma preferida de obtener los argumentos del script?

¿Hay diferencias entre los diferentes intérpretes de shell sobre esto?

+0

posible duplicado de [cuál es la diferencia entre "$ @" y "$ *" en bash?] (Http://stackoverflow.com/questions/3008695/what-the-difference-between-and-in-bash) – Daenyth

Respuesta

42

De here:

$ @ $ * se comporta como excepto que cuando citan los argumentos se divide correctamente si hay espacios en ellos.

Tome este script de ejemplo (tomado de la respuesta vinculada):

for var in "[email protected]" 
do 
    echo "$var" 
done 

da esto:

$ sh test.sh 1 2 '3 4' 
1 
2 
3 4 

Ahora cambiar "[email protected]"-$*:

for var in $* 
do 
    echo "$var" 
done 

Y obtienes esto:

$ sh test.sh 1 2 '3 4' 
1 
2 
3 
4 

(respuesta encontrada usando Google)

+11

'" $ * "' tiene otra propiedad interesante. Cada argumento está separado por el valor '$ IFS' en lugar de un espacio. –

+0

Puede valer la pena explicar cómo las sustituciones terminan expandiéndose (cómo se ven los comandos después) y por qué da lugar a resultados diferentes. –

1

Con $ @ cada parámetro es una cadena entre comillas. De lo contrario, se comporta de la misma manera.

Ver: http://tldp.org/LDP/abs/html/internalvariables.html#APPREF

+0

"Es una cadena entre comillas"?Eso implica que el uso de '" $ @ "' genera primero una cadena entrecomillada, y luego que el intérprete de comandos lo analiza al decidir cómo ejecutar el siguiente comando. Sería más exacto decir que la concatenación de cadenas hecha por '$ *' se omite, así como la división de cadenas hecha cuando '$ *' se usa sin comillas. Por lo tanto, usar '" $ @ "' no solo suele ser más correcto, sino que también es menos trabajo para el intérprete interpretar. –

+0

... por cierto, para citar '! Abs' en irc: //irc.freenode.org/#bash - La infame Guía de scripts" Bash "Bash debe evitarse a menos que sepa cómo filtrar la basura. Le enseñará a escribir errores, no scripts. En esa luz, BashGuide fue escrito: http://mywiki.wooledge.org/BashGuide –

7

Una clave diferencia de mi Punto de vista es que "$ @" conserva el número original de argumentos. Es el formulario único que lo hace. Por esa razón es muy útil para pasar argumentos con la secuencia de comandos.

Por ejemplo, si el archivo my_script contiene:

#!/bin/bash 

main() 
{ 
    echo 'MAIN sees ' $# ' args' 
} 

main $* 
main [email protected] 

main "$*" 
main "[email protected]" 

### end ### 

y ejecutarlo así:

my_script 'a b c' d e 

voy a conseguir este resultado:

PRINCIPAL ve 5 args

MAIN ve 5 args

PRINCIPAL ve 1 args

PRINCIPAL ve 3 args

Cuestiones relacionadas