Qu'est-ce que $ * et $ # sous Linux?

82

Que signifient les variables d’environnement suivantes sous Linux?

  1. Qu'est-ce que $ * (signe dollar suivi d'un astérisque)?
  2. Qu'est-ce que $ # (signe dollar à côté d'un signe dièse / signe numérique / octothorpe / signe dièse)?
raghavayc
la source

Réponses:

115

À 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, $1est 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= -yesetc.

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é.

Olli
la source
1
Ces paramètres spéciaux sont vrais dans tous les shells dérivés de Bourne (par exemple, sh, bash, dash, ash, ksh, zsh).
Dennis Williamson
Correction: $*et $#sont 1) des variables shell, pas des variables d’environnement; 2) normalisé (partie de la spécification POSIX)
grawity
3
Notez également que de "$@"nombreuses fois sont écrites comme ${1+"$@"}(pour des raisons de portabilité), voir stackoverflow.com/questions/743454/… pour une explication.
hlovdal
Étant donné que 'Le nom de la commande (paramètre 0) ne doit pas être compté ...', dans l'exemple ci-dessus, la valeur devrait être $ # = 2, à compter de 0.
Josef Klimuk
0

$# représente le nombre d'arguments:

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

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3
Vikk_King
la source
2
Bienvenue sur Super User. Le site est une base de connaissances. L'intention est donc que chaque réponse apporte une solution à la question qui n'a pas encore été apportée. Cela ne concerne que la moitié de la question et les informations sont déjà bien couvertes dans la réponse précédente.
Fix1234