2012-03-28 48 views
20

Duplicar posible:
What the difference between “[email protected]” and “$*” in bash?

Durante años y en docenas de ocasiones, he dudado entre el uso de $* y [email protected] en los scripts . Después de haber leído la sección aplicable de la página de manual de Bash una y otra vez, habiendo probado tanto $* como [email protected], no entiendo más o menos completamente la diferencia práctica de aplicación entre las dos variables. ¿Puedes iluminarme, por favor?

He estado usando $* recientemente, pero no me preguntes por qué. No sé por qué, porque no sé por qué [email protected] incluso existe, excepto como un sinónimo casi exacto de $*.

¿Existe alguna diferencia práctica?

(.. Yo personalmente tiendo a usar Bash, pero siguen siendo agnóstico respecto a la elección de la concha Mi pregunta no es específica para golpear por lo que yo sé)

+1

Buscando [$ * $ @] (http://symbolhound.com/?q=%24%40+%24*) en SymbolHound encuentra una serie de duplicados. Herramienta práctica, eso. –

+1

(También, por ejemplo, http://stackoverflow.com/questions/3307672/whats-the-difference-between-and-in-unix, http://stackoverflow.com/questions/2761723/what-is-the -difference-between-in-shell-scripts, http://stackoverflow.com/questions/4491115/what-is-the-internal-processing-of-and.) –

+0

@ChrisMorgan: Confirmado en todos los puntos. SymbolHound parece útil. No lo había sabido. La próxima vez, buscaré allí primero. ¿Debo tomar alguna medida para fusionar mi pregunta con la que sugieres? – thb

Respuesta

46

Sin cita, no hay diferencia: se amplían a todos los argumentos y se dividen en consecuencia. La diferencia viene cuando se cita. "[email protected]" se expande a argumentos correctamente citados y "$*" convierte todos los argumentos en un solo argumento. Tome esto, por ejemplo:

#!/bin/bash 

function print_args_at { 
    printf "%s\n" "[email protected]" 
} 

function print_args_star { 
    printf "%s\n" "$*" 
} 

print_args_at "one" "two three" "four" 
print_args_star "one" "two three" "four" 

continuación:

$ ./printf.sh 

one 
two three 
four 

one two three four 
5

considerar:

foo() { mv "[email protected]"; } 
bar() { mv "$*"; } 
foo a b 
bar a b 

La llamada foo intentará mv archivar a b. La llamada a la barra fallará ya que llama a mv con solo un argumento.

+0

Gracias. ¿Son * $ @ * y * $ \ ** idénticos si se usan sin comillas? – thb

+3

Sin comillas, $ @ y $ * son idénticos. –

+2

Además, en algunos shells rotos '" $ @ "' se expande a un argumento vacío '" "' si no hay parámetros posicionales, en lugar de expandirse correctamente a nada.Por lo tanto, este truco debe ser utilizado: '$ {@ +" $ @ "}' (si '$ @' no está en blanco, sustituya '" $ @ "' sino nada). Si alguna vez ves eso, sabrás por qué. – Kaz

4

Tenga en cuenta también que la magia es "[email protected]" solamente cuando no hay nada más en las citas. Estos son idénticos:

set -- a "b c" d 
some_func "foo $*" 
some_func "foo [email protected]" 

En ambos casos, some_func recibe un argumento.