Que signifie un signe dollar suivi d'un signe at (@
) dans un script Shell?
Par exemple:
umbrella_corp_options $@
$@
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.
$@
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
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
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
@
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).