Réponses:
À partir d' 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, $#
un certain nombre d'arguments sont donnés lorsque votre script a été exécuté. $*
est une chaîne contenant tous les arguments. Par exemple, $1
est le premier argument et ainsi de suite. Ceci est utile si vous souhaitez accéder à un argument spécifique dans 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.Celles-ci font partie du standard POSIX et devraient être supportées par tous les shells compatibles. Pour la référence, voici les définitions standard POSIX pour chaque paramètre spécial. Prenez note qu'il ya trois variables supplémentaires: $-
, $$
et $!
.
$@
:
S'étend aux paramètres de position, en commençant par un. Lorsque le développement a lieu entre guillemets et que la division de champ est effectuée (voir Fractionnement de champ ), chaque paramètre de position doit être développé en tant que champ séparé, à condition que le développement du premier paramètre soit toujours associé au début de celui-ci. le mot d'origine (en supposant que le paramètre développé soit incorporé dans un mot), et l'extension du dernier paramètre doit toujours être jointe à la dernière partie du mot d'origine. S'il n'y a pas de paramètre de position, le développement de "@" générera des champs nuls, même si "@" est cité entre guillemets.
$*
:
S'étend aux paramètres de position, en commençant par un. Lorsque le développement a lieu dans une chaîne entre guillemets (voir Double-guillemets ), il doit être étendu à un seul champ avec la valeur de chaque paramètre séparé par le premier caractère de la variable IFS ou par un IFS non défini. Si IFS est défini sur une chaîne NULL, cela n'équivaut pas à le désactiver; son premier caractère n'existe pas, les valeurs des paramètres sont donc concaténées.
$#
:
Se développe en nombre décimal de paramètres de position. Le nom de la commande (paramètre 0) ne doit pas être compté dans le nombre indiqué par "#" car il s'agit d'un paramètre spécial et non d'un paramètre de position.
$?
:
Développe le statut de sortie décimal du pipeline le plus récent (voir Pipelines ).
$-
:
(Hyphen.) Développe les drapeaux actuels d'option (les noms d'option d'une seule lettre concaténées dans une chaîne) comme spécifié sur l' invocation, par le jeu spécial intégré commande, ou implicitement par le shell.
$$
:
Développe l'ID de processus décimal du shell appelé. Dans un sous-shell (voir Environnement d'exécution du shell ), '$' doit avoir la même valeur que celle du shell actuel.
$!
:
Se développe en identifiant de processus décimal de la commande d'arrière-plan la plus récente (voir Listes ) exécutée à partir du shell actuel. (Par exemple, les commandes d'arrière-plan exécutées à partir de sous-shell n'affectent pas la valeur "$!" Dans l'environnement shell actuel.) Pour un pipeline, l'ID de processus est celui de la dernière commande du pipeline.
$0
:
(Zéro.) Développe le 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é.
$*
et $#
sont 1) des variables shell, pas des variables d’environnement; 2) normalisé (partie de la spécification POSIX)
"$@"
nombreuses fois sont écrites comme ${1+"$@"}
(pour des raisons de portabilité), voir stackoverflow.com/questions/743454/… pour une explication.
$#
représente le nombre d'arguments:
[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1
[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3