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


Que signifient les variables d'environnement suivantes sous Linux?

  1. Qu'est-ce que $ * (signe du dollar suivi d'un astérisque)?
  2. Qu'est-ce que $ # (signe de dollar à côté d'un signe de hachage / signe de nombre / signe octothorpe / livre)?

71
2018-02-17 18:53


origine




Réponses:


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 certain nombre d'arguments donnés lors de l'exécution de votre script. $* 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 dit, 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 de Norme POSIX, et devrait être pris en charge par tous les obus conformes. Pour la référence, ci-dessous sont les définitions standard 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 produit entre guillemets et que la division de champ (voir Fractionnement de champs) est effectuée, chaque paramètre de position doit se développer en tant que champ distinct, à condition que l'extension du premier paramètre soit toujours jointe à la partie de début du mot d'origine (en supposant que le paramètre étendu a été incorporé dans un mot), l'expansion du dernier paramètre doit toujours être jointe à la dernière partie du mot d'origine. S'il n'y a pas de paramètres de position, l'expansion de '@' générera des champs nuls, même si '@' est entre guillemets.

$*:

S'étend aux paramètres de position, à partir de un. Lorsque l'expansion se produit dans une chaîne entre guillemets (voir Double citation), il doit se développer en un seul champ 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 IFS est défini sur une chaîne vide, cela ne signifie pas le désactiver; son premier caractère n'existe pas, les valeurs des paramètres sont donc concaténées.

$#:

Développe le 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.

$?:

Développe le statut 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) comme spécifié lors de l'appel, par le ensemble commande intégrée spéciale, ou implicitement par le shell.

$$:

Développe l'ID de processus décimal du shell invoqué. Dans un sous-shell (voir Environnement d'exécution de Shell ), '$' se développe à la même valeur que celle du shell actuel.

$!:

Développe l'ID de processus décimal de la commande d'arrière-plan la plus récente (voir Des listes) exécuté à partir du shell actuel. (Par exemple, les commandes d'arrière-plan exécutées à partir de sous-couches n'affectent pas la valeur de "$!" 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é.


99
2018-02-17 18:59



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) les variables shell, pas les variables d'environnement; 2) normalisé (partie de la spécification POSIX) - grawity
Notez également que "$@" plusieurs fois est écrit comme ${1+"$@"} (pour des raisons de portabilité), voir stackoverflow.com/questions/743454/... pour une explication. - hlovdal
Puisque 'Le nom de la commande (paramètre 0) ne doit pas être compté ...', dans l'exemple ci-dessus, cela doit être $ # = 2, en commençant à compter de 0. - Josef Klimuk