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]
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]
[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.
@
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).
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
[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
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). –
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
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à! ;) –
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
Hai '$ @' e '$ *' all'indietro – iruvar
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