De ici :
$# Stores the number of command-line arguments that
were passed to the shell program.
$? Stores the exit value of the last command that was
executed.
$0 Stores the first word of the entered command (the
name of the shell program).
$* Stores all the arguments that were entered on the
command line ($1 $2 ...).
"$@" Stores all the arguments that were entered
on the command line, individually quoted ("$1" "$2" ...).
Donc, en gros, $#
est un nombre d'arguments donnés lors de l'exécution de votre script. $*
est une chaîne de caractères contenant tous les arguments. Par exemple, $1
est le premier argument et ainsi de suite. C'est utile si vous voulez accéder à un argument spécifique de votre script.
Comme Brian l'a commenté, voici un exemple simple. Si vous exécutez la commande suivante :
./command -yes -no /home/username
$#
= 3
$*
= -yes -no /home/username
$@
= tableau : {"-yes", "-no", "/home/username"}
$0
= ./command
, $1
= -yes
etc.
Ils font partie de la norme POSIX , et devraient être pris en charge par tous les shells conformes. Pour référence, voici les définitions de la norme POSIX pour chaque paramètre spécial. Notez qu'il y a trois variables supplémentaires : $-
, $$
et $!
.
$@
:
S'étend aux paramètres de position, à partir de un. Lorsque l'expansion se fait entre guillemets, et lorsqu'une division de champ (voir Division de champ ) est effectuée, chaque paramètre de position se développe comme un champ séparé, à condition que l'expansion du premier paramètre soit toujours jointe à la partie de début du mot d'origine (en supposant que le paramètre développé était inclus dans un mot), et que l'expansion du dernier paramètre soit toujours jointe à la dernière partie du mot d'origine. S'il n'y a pas de paramètres de position, l'expansion de “@” doit générer des champs zéro, même si “@” est entre guillemets.
$*
:
Se développe en fonction des paramètres de position, à partir de un. Lorsque l'expansion a lieu dans une chaîne entre guillemets (voir entre guillemets), elle se développe en un seul champ dont la valeur de chaque paramètre est séparée par le premier caractère de la variable IFS, ou par un si IFS n'est pas défini. Si la variable IFS est définie comme une chaîne nulle, cela n'équivaut pas à l'annuler ; son premier caractère n'existe pas, de sorte que les valeurs des paramètres sont concaténées.
$#
:
Se développe jusqu'au nombre décimal de paramètres de position. Le nom de la commande (paramètre 0) ne doit pas être compté dans le nombre donné par “#” car il s'agit d'un paramètre spécial, et non d'un paramètre de position.
$?
:
Passe à l'état de sortie décimal du pipeline le plus récent (voir Pipelines ).
$-
:
(Trait d'union) Se développe en fonction des drapeaux d'option actuels (les noms d'option à une lettre concaténés en une chaîne de caractères) tels que spécifiés lors de l'invocation, par la commande intégrée spéciale set ou implicitement par le shell.
$$
:
Se développe jusqu'à l'ID de processus décimal de l'interpréteur de commandes invoqué. Dans un sous-coque (voir Environnement d'exécution du shell ), “$” se développe à la même valeur que celle du shell actuel.
$!
:
Se développe jusqu'à l'ID décimal du processus de la dernière commande de fond (voir Listes ) exécutée depuis le shell actuel. (Par exemple, les commandes d'arrière-plan exécutées à partir de sous-coques n'affectent pas la valeur de “$ !” dans l'environnement du shell actuel). Pour un pipeline, l'ID du processus est celui de la dernière commande dans le pipeline.
$0
:
(Zéro.) Se développe au nom du shell ou du script shell. Voir sh pour une description détaillée de la façon dont ce nom est dérivé.