104 votes

Que sont $* et $# sous Linux ?

Que signifient les variables d'environnement suivantes dans Linux ?

  1. Qu'est-ce que $* (signe de dollar suivi d'un astérisque) ?
  2. Qu'est-ce qu'un $# (signe de dollar à côté d'un dièse/signe de chiffre/octothorpe/signe de livre) ?

146voto

Cristian Sitov Points 71

から 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 lorsque votre script a été exécuté. $* est une chaîne de caractères contenant tous les arguments. Par exemple, $1 est le premier argument et ainsi de suite. Ceci est utile, si vous voulez accéder à un argument spécifique dans votre script.

Comme l'a fait remarquer Brian, 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.

Ceux-ci font partie de Norme POSIX et devrait être soutenu par toutes les coquilles conformes. Pour référence, voici les définitions standard POSIX pour chaque paramètre spécial. Notez qu'il y a trois variables supplémentaires : $- , $$ y $! .

$@ :

S'étend aux paramètres positionnels, en commençant par un. Lorsque l'expansion se produit à l'intérieur de guillemets doubles, et lorsque le fractionnement des champs (cf. Fractionnement du champ ) est effectuée, chaque paramètre positionnel est développé comme un champ séparé, à condition que le développement du premier paramètre soit toujours lié à la partie initiale du mot d'origine (en supposant que le paramètre développé soit intégré dans un mot), et que le développement du dernier paramètre soit toujours lié à la dernière partie du mot d'origine. S'il n'y a pas de paramètres positionnels, le développement de '@' ne génère aucun champ, même si '@' est cité deux fois.

$* :

S'étend aux paramètres positionnels, en commençant par un. Lorsque l'expansion se produit dans une chaîne de caractères doublement citée (voir Double guillemets ), il se développe en un champ unique avec la valeur de chaque paramètre 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 de caractères nulle, cela n'équivaut pas à l'annuler ; son premier caractère n'existe pas, et les valeurs des paramètres sont donc concaténées.

$# :

S'étend au nombre décimal de paramètres positionnels. Le nom de la commande (paramètre 0) n'est pas compté dans le nombre indiqué par '#' car il s'agit d'un paramètre spécial et non d'un paramètre positionnel.

$? :

S'étend à l'état de sortie décimal du pipeline le plus récent (voir Pipelines ).

$- :

(Trait d'union.) S'étend aux drapeaux d'option actuels (les noms d'option à une lettre concaténés en une chaîne) tels que spécifiés lors de l'invocation, par la commande set commande spéciale intégrée, ou implicitement par le Shell.

$$ :

S'étend à l'ID de processus décimal du Shell invoqué. Dans un sous-shell (voir Shell. ), '$' sera étendu à la même valeur que celle du Shell actuel.

$! :

S'étend à l'ID de processus décimal de la commande d'arrière-plan la plus récente (voir Listes ) exécuté à partir du Shell actuel. (Par exemple, les commandes d'arrière-plan exécutées depuis des sous-shells n'affectent pas la valeur de "$ !" dans l'environnement Shell actuel). Pour un pipeline, l'ID du processus est celui de la dernière commande du pipeline.

$0 :

(Zéro.) S'étend au nom du Shell ou Shell Shell. Voir sh pour une description détaillée de la façon dont ce nom est dérivé.

-1voto

maxkfranz Points 1398

$# représente le nombre d'arguments :

[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X