2012-04-03 24 views
72

¿Qué significa un signo de dólar seguido de un signo al (@) en un script de shell?

Por ejemplo:

umbrella_corp_options [email protected] 
+4

posible duplicado de [lo que es $ @ o la búsqueda de una explicación de $ @ en bash] (http://stackoverflow.com/questions/3898665/what-is-or-searching-for-an-explaination-of-in-bash) – l0b0

Respuesta

106

[email protected] es todo de los parámetros pasados ​​al script.

Por ejemplo, si llama a ./someScript.sh foo bar, entonces [email protected] será igual a foo bar.

Si lo hace:

./someScript.sh foo bar 

y luego dentro someScript.sh referencia:

umbrella_corp_options "[email protected]" 

esto se pasará a umbrella_corp_options con cada parámetro individual entre comillas dobles, lo que permite tomar parámetros con espacio en blanco de la persona que llama y páselos.

+0

STATUS_ACCESS_DEN ... edición elegante gracias! – Har

+0

¿Qué incluiría $ @ si lo hiciera 'someScript.sh foo bar" boo far "'? – trusktr

+0

http://teaching.idallen.com/dat2330/04f/notes/shell_variables.txt Mira esto. – Har

5

From the manual:

@

se expande a la parámetros posicionales, a partir de 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" .... Si la expansión de comillas dobles ocurre dentro de una palabra, la expansión del primer parámetro se une con la parte inicial de la palabra original, y el la expansión del último parámetro se une con la última parte de la palabra original. Cuando no hay parámetros posicionales, "$ @" y $ @ se expanden a nada (es decir, se eliminan).

8

el uso de un [email protected] puro significa en la mayoría de los casos "daño al programador tan duro como sea posible", porque en la mayoría de los casos conduce a problemas con la separación de la palabra y con espacios y otros caracteres en los argumentos.

En (adivinado) el 99% de todos los casos, se requiere encerrarlo en ": "[email protected]" es lo que se puede usar para iterar confiablemente sobre los argumentos.

for a in "[email protected]"; do something_with "$a"; done 
+4

Tu línea se puede escribir como: para a; hacer algo con "$ a"; hecho ;-) – Alfe

+1

@Alfe Lo sé, pero lo he olvidado. Piense en ello como 'para a en start_token" $ @ "end_token; hacer algo con "$ a"; done' :-) – glglgl

54

[email protected] es casi la misma que $*, tanto significa "todos los argumentos de línea de comando". A menudo se usan para pasar simplemente todos los argumentos a otro programa (formando así un envoltorio alrededor de ese otro programa).

La diferencia entre las dos sintaxis aparece cuando tiene un argumento con espacios en él (p. Ej.) Y poner [email protected] en comillas dobles:

wrappedProgram "[email protected]" 
# ^^^ this is correct and will hand over all arguments in the way 
#  we received them, i. e. as several arguments, each of them 
#  containing all the spaces and other uglinesses they have. 
wrappedProgram "$*" 
# ^^^ this will hand over exactly one argument, containing all 
#  original arguments, separated by single spaces. 
wrappedProgram $* 
# ^^^ this will join all arguments by single spaces as well and 
#  will then split the string as the shell does on the command 
#  line, thus it will split an argument containing spaces into 
#  several arguments. 

Ejemplo: Llamada

wrapper "one two three" four five "six seven" 

resultará en:

"[email protected]": wrappedProgram "one two three" four five "six seven" 
"$*": wrappedProgram "one two three four five six seven" 
$*: wrappedProgram one two three four five six seven 
+1

Son * no * lo mismo, y la página de manual es clara sobre los efectos secundarios de $ * utilizando IFS, que no es necesariamente espacio. (Si fueran lo mismo, no tendría ningún sentido, aparte de la compatibilidad, ofrecer ambos.) –

+5

No, no lo son. Y lo dije dos líneas a continuación: "La diferencia entre los dos ..." Para obtener oraciones cortas y aumentar la legibilidad, el lector tiene que leer más de una oración antes de emitir un veredicto: -/ – Alfe

+1

Alfe, la inserción de Christoffer de eso una palabra "casi" marcó una gran diferencia, sin sacrificar la precisión ni la legibilidad. De hecho, superé esta respuesta (en oposición a la aceptada) exactamente debido a ese énfasis sutil de la * diferencia * ... ¡antes de darme cuenta de que era casi en contra de tu voluntad! ;) –

13

Estos son los argumentos de línea de comandos donde:

[email protected] = almacena todos los argumentos en una lista de cadena
$* = almacena todos los argumentos como una única cadena
$# = almacena el número de argumentos

+1

Tienes '$ @' y '$ *' al revés – iruvar

Cuestiones relacionadas