2012-03-28 4 views
20

Possible en double:
What the difference between “[email protected]” and “$*” in bash?

Pendant des années et des dizaines de fois, j'ai hésité entre l'utilisation de $* et [email protected] dans les scripts shell . Après avoir lu la section applicable de la page de manuel de Bash encore et encore, après avoir essayé à la fois $* et [email protected], je ne parviens pas à comprendre plus ou moins la différence pratique d'application entre les deux variables. Pouvez-vous m'éclairer, s'il vous plaît? J'ai utilisé récemment $*, mais ne me demandez pas pourquoi. Je ne sais pas pourquoi, parce que je ne sais pas pourquoi [email protected] existe même, sauf comme un synonyme presque exact pour $*.

Y at-il une différence pratique?

(.. Je tends personnellement à utiliser Bash, mais reste agnostique en ce qui concerne le choix de la coque Ma question n'est pas spécifique à Bash pour autant que je sache)

+1

La recherche de [$ * $ @] (http://symbolhound.com/?q=%24%40+%24*) sur SymbolHound trouve un certain nombre de doublons. Outil pratique, ça. –

+1

(Aussi, par exemple, http://stackoverflow.com/questions/3307672/whats-the-difference-between-and-in-unix, http://stackoverflow.com/questions/2761723/what-is-the -différence-entre-et-dans-shell-scripts, http://stackoverflow.com/questions/4491115/what-is-the-internal-processing-of-and.) –

+0

@ChrisMorgan: Confirmé sur tous les points. SymbolHound semble pratique. Je ne savais pas à ce sujet. La prochaine fois, j'y chercherai d'abord. Dois-je prendre des mesures pour fusionner ma question avec celle que vous suggérez? – thb

Répondre

46

Sans guillemets, il n'y a pas de différence: ils sont étendus à tous les arguments et sont divisés en conséquence. La différence vient en citant. "[email protected]" étend à des arguments correctement cités et "$*" rend tous les arguments dans un seul argument. Prenez ceci par exemple:

#!/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" 

Puis:

$ ./printf.sh 

one 
two three 
four 

one two three four 
5

Tenir compte:

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

L'appel à foo va tenter de mv fichier a à b. L'appel à la barre échouera car il appelle mv avec un seul argument.

+0

Merci. Est-ce que * $ @ * et * $ \ ** sont identiques s'ils sont utilisés sans guillemets? – thb

+3

Sans les guillemets, $ @ et $ * sont identiques. –

+2

De même, sur certains shells brisés '" $ @ "' se développe en un argument vide '" "' s'il n'y a pas de paramètres positionnels, plutôt que de passer correctement à rien.Donc, cette astuce doit être utilisée: '$ {@ +" $ @ "}' (si '$ @' est non vide, remplacez "$ @" sinon rien). Si vous voyez cela, vous saurez pourquoi. – Kaz

4

Notez également que "[email protected]" est magique que quand il n'y a rien d'autre dans les citations. Ils sont identiques:

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

Dans les deux cas, un_func reçoit un argument.