2012-04-03 23 views
72

Che cosa significa un segno di dollaro seguito da un segno di apertura (@) in uno script di shell?

Ad esempio:

umbrella_corp_options [email protected] 
+4

possibile duplicato di [ciò che è $ @ o alla ricerca di una spiegazione di $ @ in bash] (http://stackoverflow.com/questions/3898665/what-is-or-searching-for-an-explain-of-in-bash) – l0b0

risposta

106

[email protected] è tutte dei parametri passati allo script.

Ad esempio, se si chiama ./someScript.sh foo bar allora [email protected] sarà uguale a foo bar.

Se lo fai:

./someScript.sh foo bar 

e poi dentro someScript.sh di riferimento:

umbrella_corp_options "[email protected]" 

questo sarà passato al umbrella_corp_options con ogni singolo parametro racchiuso tra virgolette, che consente di prendere i parametri con spazio vuoto dal chiamante e trasmetterli.

+0

STATUS_ACCESS_DEN ... editing di fantasia grazie! – Har

+0

Cosa sarebbe $ @ contenere se ho fatto 'someScript.sh foo bar" boo lontano "'? – trusktr

+0

http://teaching.idallen.com/dat2330/04f/notes/shell_variables.txt Dai un'occhiata a questo. – Har

5

From the manual:

@

espande nei parametri posizionali, a partire da uno. Quando l'espansione avviene tra virgolette doppie, ciascun parametro si espande in una parola separata. Cioè, "$ @" equivale a "$ 1" "$ 2" .... Se l'espansione a virgolette 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).

8

L'utilizzo di un puro mezzo [email protected] nella maggior parte dei casi "ferire il programmatore così difficile come è possibile", perché nella maggioranza dei casi porta a problemi con la separazione parola e con gli spazi e gli altri personaggi di argomenti.

In (azzeccato) il 99% di tutti i casi, è necessario includerlo in ": "[email protected]" è ciò che può essere utilizzato per iterare in modo affidabile sugli argomenti.

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

La tua linea può essere scritto come: per a; fai qualcosa con "$ a"; fatto ;-) – Alfe

+1

@ Alfe lo so, l'ho appena dimenticato. Consideralo come 'for a in start_token" $ @ "end_token; fai qualcosa con "$ a"; done' :-) – glglgl

54

[email protected] è quasi la stessa di $*, sia che significa "tutti gli argomenti della riga di comando". Sono spesso usati per passare semplicemente tutti gli argomenti a un altro programma (formando così un wrapper attorno a quell'altro programma).

La differenza tra le due sintassi si manifesta quando si dispone di un argomento con spazi in esso (ad es.) E mettere [email protected] tra virgolette:

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. 

Esempio: Richiamo

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

si tradurrà in:

"[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

Non sono * uguali * e la manpage è chiara sugli effetti collaterali di $ * usando IFS, che non è necessariamente spazio. (Se fossero uguali, non ci sarebbe alcun punto, a parte forse la compatibilità, nell'offrirli entrambi). –

+5

No, non lo sono. E ho detto così due righe qui sotto: "La differenza tra i due ..." Per ottenere brevi frasi e aumentare la leggibilità il lettore deve leggere più di una frase prima di dare un verdetto: -/ – Alfe

+1

Alfe, l'inserimento di Christoffer di quello una parola "quasi" ha fatto una grande differenza, senza sacrificare alcuna chiarezza o leggibilità. In effetti ho svalutato questa risposta (al contrario di quella accettata) esattamente a causa di quella sottile enfasi della * differenza * ... - prima di rendermi conto che era quasi contro la tua volontà! ;) –

13

Questi sono gli argomenti della riga di comando in cui:

[email protected] = memorizza tutti gli argomenti in un elenco di stringhe
$* = memorizza tutti gli argomenti come una singola stringa
$# = memorizza il numero di argomenti

+1

Hai '$ @' e '$ *' all'indietro – iruvar

Problemi correlati