web-dev-qa-db-fra.com

Que signifie $ @ dans un script shell?

Que signifie un signe dollar suivi d'un signe at (@) dans un script Shell?

Par exemple:

umbrella_corp_options $@
149
trusktr

$@ est tous parmi les paramètres transmis au script.

Par exemple, si vous appelez ./someScript.sh foo bar, alors $@ sera égal à foo bar.

Si tu fais:

./someScript.sh foo bar

puis à l'intérieur de someScript.sh référence:

umbrella_corp_options "$@"

ceci sera passé à umbrella_corp_options avec chaque paramètre individuel entre guillemets, ce qui permettra de prendre les paramètres avec un espace vide de l'appelant et de les transmettre.

200
Har

$@ est presque identique à $*, les deux signifiant "tous les arguments de la ligne de commande". Ils sont souvent utilisés pour simplement passer tous les arguments à un autre programme (formant ainsi une enveloppe autour de cet autre programme).

La différence entre les deux syntaxes apparaît lorsque vous avez un argument avec des espaces (par exemple) et que vous mettez $@ entre guillemets:

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.

Exemple: appeler

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

aura pour résultat:

"$@": 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
88
Alfe

Ce sont les arguments en ligne de commande où:

$@ = stocke tous les arguments dans une liste de chaînes
$* = stocke tous les arguments en tant que chaîne unique
$# = enregistre le nombre d'arguments

29
Sameer Duwal

L'utilisation d'un $@ pur signifie dans la plupart des cas "nuire le plus possible au programmeur", car cela entraîne généralement des problèmes de séparation de Word, d'arguments et de caractères.

Dans (supposé) 99% des cas, il est nécessaire de le mettre dans ": "$@" est ce qui peut être utilisé pour effectuer une itération fiable sur les arguments.

for a in "$@"; do something_with "$a"; done
9
glglgl

extrait du manuel:

@

Se développe jusqu'aux paramètres de position, en commençant par un. Lorsque le développement se produit entre guillemets doubles, chaque paramètre se développe dans un mot distinct. C'est-à-dire que "$ @" équivaut à "$ 1" "$ 2" .... Si l'extension double guillemet se produit dans un mot, l'extension du premier paramètre est jointe à la partie de début du mot d'origine et l'expansion du dernier paramètre est jointe à la dernière partie du mot d'origine. Quand il n'y a pas de paramètre de position, "$ @" et $ @ sont étendus à néant (c'est-à-dire qu'ils sont supprimés).