Dans de nombreuses questions SO et didacticiels bash, je constate que je peux accéder aux arguments de ligne de commande dans les scripts bash de deux manières:
$ ~ >cat testargs.sh
#!/bin/bash
echo "you passed me" $*
echo "you passed me" $@
Ce qui se traduit par:
$ ~> bash testargs.sh arg1 arg2
you passed me arg1 arg2
you passed me arg1 arg2
Quelle est la difference entre $*
et $@
?
Quand faut-il utiliser la première et quand doit-on utiliser la seconde?
echo "something $@"
comme une erreurRéponses:
La différence apparaît lorsque les paramètres spéciaux sont cités. Permettez-moi d'illustrer les différences:
un autre exemple sur l'importance de la citation: notez qu'il y a 2 espaces entre "arg" et le nombre, mais si je ne cite pas $ word:
et en bash,
"$@"
est la liste "par défaut" sur laquelle itérer:la source
$*
ou"$*"
peut être requis, et l'objectif ne peut pas être atteint par$@
ou"$@"
?"$@"
avec les guillemets.Un joli tableau de présentation pratique du wiki Bash Hackers :
où
c
dans la troisième ligne est le premier caractère de$IFS
, le séparateur de champ interne, une variable shell.Si les arguments doivent être stockés dans une variable de script et que les arguments doivent contenir des espaces, je recommande sans réserve d'employer une
"$*"
astuce avec le séparateur de champ interne$IFS
défini sur tab .la source
$IFS
signifie "Séparateur de champ interne".$ *
$ @
Source: Bash man
la source
$ @ est identique à $ *, mais chaque paramètre est une chaîne entre guillemets, c'est-à-dire que les paramètres sont transmis intacts, sans interprétation ni expansion. Cela signifie, entre autres, que chaque paramètre de la liste d'arguments est considéré comme un mot distinct.
Bien sûr, "$ @" doit être cité.
http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST
la source
Cet exemple peut mettre en évidence la différence entre "at" et "asterix" pendant que nous les utilisons. J'ai déclaré deux tableaux "fruits" et "légumes"
Voir le résultat suivant le code ci-dessus:
la source