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 $@
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.
$@
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
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
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
@
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).