906 votes

Quelles sont les variables spéciales du shell avec le signe dollar ?

Dans Bash, il semble y avoir plusieurs variables qui détiennent des valeurs spéciales et constantes. Par exemple,

./myprogram &; echo $!

retournera le PID du processus qui s'est mis en arrière-plan. myprogram . J'en connais d'autres, comme $? qui, je pense, est l'ATS actuel. Y en a-t-il d'autres ?

22 votes

Plusieurs d'entre eux ne sont pas réservés aux Bash. Ils sont aussi utilisés dans d'autres shells liés à Bourne et sont en fait spécifiés par POSIX .

1 votes

Qu'en est-il : IFS=$' \n Voir : stackoverflow.com/questions/4128235/

1 votes

@sgu Ce n'est pas un paramètre ; c'est un type spécial de citation. $'\n' est un caractère de nouvelle ligne littéral qui résulte du remplacement du digraphe \n avec ASCII 10.

1554voto

kojiro Points 24374
  • $1 , $2 , $3 ... sont les paramètres de position .
  • "$@" est une construction de type tableau de tous les paramètres positionnels, {$1, $2, $3 ...} .
  • "$*" est l'expansion IFS de tous les paramètres positionnels, $1 $2 $3 ... .
  • $# est le nombre de paramètres positionnels.
  • $- les options actuelles de l'interpréteur de commandes.
  • $$ pid du shell actuel (pas de subshell).
  • $_ le paramètre le plus récent (ou le chemin abs de la commande pour démarrer le shell actuel immédiatement après le démarrage).
  • $IFS est le séparateur de champs (d'entrée).
  • $? est l'état le plus récent de la sortie du pipeline de premier plan.
  • $! est le PID de la commande d'arrière-plan la plus récente.
  • $0 est le nom du shell ou du shell script.

La plupart des éléments ci-dessus peuvent être trouvés sous Paramètres spéciaux dans le manuel de référence de Bash. On y trouve tous les variables d'environnement définies par le shell .

Pour un index complet, veuillez consulter le Manuel de référence Index des variables .

5 votes

Ils sont tous documentés dans le bash page de manuel. La seule bizarrerie est que $_ n'est mentionnée que dans le contexte de son utilisation dans la MAILPATH variable.

8 votes

@chepner look in man(1) bash sous Paramètres spéciaux pour le reste de la définition de $_ .

9 votes

J'utilise !$ au lieu de $_ dans les scripts bash, car cette dernière échoue parfois.

50voto

Dan Points 1322
  • $_ dernier argument de la dernière commande
  • $# nombre d'arguments passés au script actuel
  • $* / $@ liste des arguments passés au script sous forme de chaîne / liste délimitée.

du haut de ma tête. Recherchez les variables spéciales de Bash sur Google.

144 votes

"Je l'ai fait. Ils m'ont envoyé ici." -- Sketch de la librairie (doc. officiel) gnu.org/software/bash/manual/bashref.html#Special-Parameters )

1 votes

Je pense $@ est la chaîne de caractères et $* est la liste délimitée (selon la réponse acceptée ci-dessus, en tout cas).

1 votes

@RastaJedi : "$@" se développe en une liste, "$*" se développe en une seule chaîne. Le comportement spécial de $@ s'applique lorsqu'il est entre guillemets.

22voto

fedorqui Points 42938

Pour aider à comprendre ce que font $# , $0 et $1 , ..., $n j'utilise ce script :

#!/bin/bash

for ((i=0; i<=$#; i++)); do
  echo "parameter $i --> ${!i}"
done

Son exécution renvoie une sortie représentative :

$ ./myparams.sh "hello" "how are you" "i am fine"
parameter 0 --> myparams.sh
parameter 1 --> hello
parameter 2 --> how are you
parameter 3 --> i am fine

7 votes

Que signifie le !i dans votre boucle for ? C'est en fait la raison pour laquelle je suis ici et je ne trouve pas de réponse nulle part car je ne sais pas comment l'appeler.

9 votes

@Anthony cela s'appelle indirection de variable . Vous pouvez trouver une bonne explication de son usage dans bash : expansion indirecte, veuillez expliquer ? .

4voto

Adrian Cole Points 39

Faites attention avec certains des exemples ; $0 peut inclure un chemin principal ainsi que le nom du programme. Par exemple, enregistrez ce script de deux lignes sous ./mytry.sh et exécutez-le.

#!/bin/bash

echo "parameter 0 --> $0" ; exit 0

Sortie :

parameter 0 --> ./mytry.sh

Ceci se fait sur une version actuelle (année 2016) de Bash, via Slackware 14.2

6 votes

Le fait que $0 inclut un chemin ou non dépend de la façon dont vous avez exécuté le script en premier lieu. Si vous avez exécuté "./mytry.sh" c'est ce que vous verrez dans $0. Si vous avez entré "~/mytry.sh" vous verrez le chemin complet (parce que le shell aura développé ~). Si vous avez fait ". mytry.sh", vous verrez 'bash'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X