2012-09-07 13 views
213

In molti SO domande ed esercitazioni bash vedo che posso accedere argomenti della riga di comando negli script bash in due modi:

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

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

che si traduce in:

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

Qual è la differenza tra $* e [email protected]?
Quando si dovrebbe utilizzare l'ex e quando si deve utilizzare questi ultimi?

+0

dai un'occhiata a questa risposta: http://stackoverflow.com/a/842325/671366 – codeling

+2

@nyarlathotep, grazie, la domanda è utile. Il titolo è terribile. Non indovinerei mai la risposta mostra quello che stavo cercando. In qualche modo, la mia domanda è davvero banale, ma il modo in cui l'ho formulata nella mia testa non è stata facile da trovare nel manuale di bash (anche se/* ti porta nel posto giusto ...) – Oz123

risposta

286

La differenza appare quando i parametri speciali sono quotati.Permettetemi di illustrare le differenze:

$ 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 ulteriore esempio l'importanza di citare: notare ci sono 2 spazi tra "arg" e il numero, ma se non riesco a citare $ parola:

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

e in bash, "[email protected]" è la lista "default" per iterare:

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

+1 Ho sempre pensato che questo il concetto è stato meglio dimostrato da un semplice esempio, in cui manca completamente il manuale di bash. – chepner

+5

C'è un possibile caso d'uso, quando '$ *' o '" $ * "' può essere richiesto, e lo scopo non può essere servito da '$ @' o '" $ @ "'? – anishsane

+0

Inoltre, c'è una differenza tra '$ {arrayname [*]}' vs '$ {arrayname [@]}'? – anishsane

15

$ @ è uguale a $ *, ma ogni parametro è una stringa tra virgolette, cioè, i parametri sono passati intatti, senza interpretazione o l'espansione. Ciò significa, tra le altre cose, che ogni parametro nella lista degli argomenti è visto come una parola separata.

Naturalmente, "$ @" dovrebbe essere citato.

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

33

$ *

espande nei parametri posizionali, a partire da uno. Quando l'espansione si verifica tra virgolette doppie, si espande in una singola parola con il valore di ciascun parametro separato dal primo carattere di variabile speciale IFS. Cioè, "$ *" equivale a "$ 1c $ 2c ...", dove c è il primo carattere del valore della variabile IFS. Se IFS non è impostato, i parametri sono separati da spazi. Se IFS è nullo, i parametri vengono uniti senza separatori intermedi.

$ @

espande nei parametri posizionali, a partire da uno. Quando l'espansione si verifica tra virgolette doppie, ciascun parametro si espande in una parola separata . Cioè, "$ @" equivale a "$ 1" "$ 2" ... Se l'espansione a virgolette doppie si verifica all'interno di una parola, l'espansione del primo parametro viene unita alla parte iniziale della parola originale , e l'espansione dell'ultimo parametro è unita all'ultima parte della parola originale. Quando non ci sono parametri posizionali, "$ @" e $ @ non si espandono su nulla (ad esempio, vengono rimossi).

Fonte: Bash man

148

Un bel ettari ndy tabella riassuntiva dalla Bash Hackers Wiki:

$* versus $@ table

Se gli argomenti devono essere conservati in una variabile di script e gli argomenti sono tenuti a contenere spazi, vi consiglio con tutto il cuore che impiega un "$*" trick with the internal field separator $IFS set to tab.

+32

... dove "c" è il primo carattere di $ IFS –

+31

... e "$ IFS" sta per "Separatore di campo interno". –

+0

Ecco [un esempio] (https://stackoverflow.com/a/4824637/2192488), che include l'inserimento tra virgolette. Anche l'input è importante! –

Problemi correlati