Cosa significa un simbolo di dollaro seguito da un simbolo at ( @) in uno script shell?
Per esempio:
umbrella_corp_options $@
Cosa significa un simbolo di dollaro seguito da un simbolo at ( @) in uno script shell?
Per esempio:
umbrella_corp_options $@
Risposte:
$@sono tutti i parametri passati allo script.
Ad esempio, se chiami ./someScript.sh foo barallora $@sarà uguale a foo bar.
Se fate:
./someScript.sh foo bar
e poi someScript.shriferimento interno :
umbrella_corp_options "$@"
questo verrà passato a umbrella_corp_optionsogni singolo parametro racchiuso tra virgolette doppie, consentendo di prendere parametri con uno spazio vuoto dal chiamante e trasmetterli.
someScript.sh foo bar "boo far"?
$@non proviene necessariamente da parametri passati allo script ... ad esempio; set a b "x y"; printf '(%s)' "$@"uscite(a)(b)(x y)
$@e$*
$@è quasi uguale a $*, entrambi significano "tutti gli argomenti della riga di comando". Sono spesso usati per semplicemente passare tutti gli argomenti a un altro programma (formando così un involucro attorno a quell'altro programma).
La differenza tra le due sintassi si presenta quando si ha un argomento con spazi (ad es.) E si mettono $@tra virgolette:
wrappedProgram "$@"
# ^^^ 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: chiamata
wrapper "one two three" four five "six seven"
comporterà:
"$@": wrappedProgram "one two three" four five "six seven"
"$*": wrappedProgram "one two three four five six seven"
^^^^ These spaces are part of the first
argument and are not changed.
$*: wrappedProgram one two three four five six seven
wrappedProgram "$*"-> separated by single spaces.ma nel tuo secondo esempio non sono separati da spazi singoli.
Questi sono gli argomenti della riga di comando in cui:
$@= memorizza tutti gli argomenti in un elenco di stringhe
$*= memorizza tutti gli argomenti come una singola stringa
$#= memorizza il numero di argomenti
L'uso di un $@mezzo puro nella maggior parte dei casi "danneggia il programmatore il più forte possibile", perché nella maggior parte dei casi porta a problemi con la separazione delle parole e con spazi e altri caratteri negli argomenti.
Nel (indovinato) 99% di tutti i casi, è necessario racchiuderlo in ": "$@"è ciò che può essere usato per iterare in modo affidabile sugli argomenti.
for a in "$@"; do something_with "$a"; done
for a in start_token "$@" end_token; do something_with "$a"; done:-)
@
Si espande nei parametri posizionali, a partire da uno. Quando l'espansione avviene tra virgolette doppie, ogni parametro si espande in una parola separata. Ossia, "$ @" equivale a "$ 1" "$ 2" .... Se l'espansione tra virgolette doppie si verifica all'interno di una parola, l'espansione del primo parametro viene unita alla parte iniziale della parola originale e il l'espansione dell'ultimo parametro viene unita all'ultima parte della parola originale. Quando non ci sono parametri posizionali, "$ @" e $ @ si espandono in nulla (cioè vengono rimossi).
In breve, si $@espande agli argomenti posizionali passati dal chiamante a una funzione o uno script . Il suo significato dipende dal contesto : all'interno di una funzione, si espande agli argomenti passati a tale funzione. Se utilizzato in uno script (non all'interno dell'ambito di una funzione), si espande agli argomenti passati a tale script.
$ cat my-sh
#! /bin/sh
echo "$@"
$ ./my-sh "Hi!"
Hi!
$ put () ( echo "$@" )
$ put "Hi!"
Hi!
Ora, un altro argomento di fondamentale importanza quando si comprende come $@si comporta nella shell è la suddivisione delle parole . La shell divide i token in base al contenuto della IFSvariabile. Il suo valore predefinito è \t\n; ovvero spazi bianchi, tabulazione e newline.
L'espansione "$@"ti dà una copia incontaminata degli argomenti passati. Tuttavia, l'espansione $@non sempre. Più specificamente, se gli argomenti contengono caratteri da IFS, verranno divisi.
Il più delle volte ciò che vorrai usare è "$@"no $@.