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 $@
104
demandé sur Henk Langeveld 2012-04-03 17:28:30

5 réponses

$@ est tous des paramètres passés au script.

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

si vous le faites:

./someScript.sh foo bar

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

umbrella_corp_options "$@"

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

142
répondu Har 2018-01-04 19:00:14

$@ est presque le même que $* , tous deux signifiant "tous les arguments en 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 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: Appel

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

résultera en:

"$@": 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
67
répondu Alfe 2018-04-04 13:55:51

ce sont les arguments de ligne de commande où:

$@ = stocke tous les arguments dans une liste de chaîne

$* = stocke tous les arguments en une seule chaîne

$# = stocke le nombre d'arguments

22
répondu Sameer Duwal 2015-11-22 08:49:11

l'usage d'un pur $@ signifie dans la plupart des cas" blesser le programmeur aussi dur que vous pouvez", parce que dans la plupart des cas, il conduit à des problèmes avec la séparation des mots et avec les espaces et d'autres caractères dans les arguments.

dans (deviné) 99% de tous les cas, il est nécessaire de l'inclure dans " : "$@" est ce qui peut être utilisé pour itérer de manière fiable sur les arguments.

for a in "$@"; do something_with "$a"; done
9
répondu glglgl 2012-04-03 13:34:08

du manuel:

@

S'étend aux paramètres de position, à partir d'un. Lorsque l'expansion se produit dans des guillemets doubles, chaque paramètre se développe à un mot séparé. C'est-à-dire, "$ @ " est l'équivalent de "$1" "$2" .... Si l'expansion double-Citée se produit dans un mot, l'expansion du premier paramètre est jointe avec la partie de début du mot original, et l'expansion du le dernier paramètre est joint à la dernière partie du mot d'origine. Quand il n'y a pas des paramètres positionnels, "$ @ "" et " $ @ étendre à rien (c'est à dire, ils sont supprimés).

6
répondu Christoffer Hammarström 2012-04-03 13:31:08