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

782

Dans Bash, il semble y avoir plusieurs variables qui contiennent des valeurs spéciales à signification cohérente. Par exemple,

./myprogram &; echo $!

renverra le PID du processus en arrière-plan myprogram. J'en connais d'autres, $?dont je pense qu'il s'agit de l'ATS actuel. Y en a-t-il d'autres?

Z Douglas
la source
15
Plusieurs d'entre eux ne sont pas uniquement Bash. Ils sont également utilisés dans d'autres shells liés à Bourne et sont en fait spécifiés par POSIX .
pause jusqu'à nouvel ordre.
1
Qu'en est-il: IFS = $ '\ n' Voir: stackoverflow.com/questions/4128235/…
sgu
1
@sgu Ce n'est pas un paramètre; c'est un type particulier de citation. $'\n'est un caractère littéral de nouvelle ligne qui résulte du remplacement du digraphe \npar ASCII 10.
chepner
Si vous êtes venu ici chercher ${1}, ${*}etc., les accolades sont juste pour homonymie, et souvent redondants. Isolé, ${x}est exactement équivalent à $x.
tripleee
Que veut $!dire? Je suis au courant, !$mais pas de cela.
Sridhar Sarnobat

Réponses:

1360
  • $1, $2, $3, ... sont les paramètres de position .
  • "$@"est une construction semblable à un tableau de tous les paramètres de position, {$1, $2, $3 ...}.
  • "$*"est l'expansion de l' IFS de tous les paramètres de position, $1 $2 $3 ....
  • $# est le nombre de paramètres positionnels.
  • $- options actuelles définies pour le shell.
  • $$ pid du shell actuel (pas de sous-shell).
  • $_ paramètre le plus récent (ou le chemin abs de la commande pour démarrer le shell courant immédiatement après le démarrage).
  • $IFS est le séparateur de champ (d'entrée).
  • $? est le dernier état de sortie de 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 script shell.

La plupart des éléments ci-dessus se trouvent sous Paramètres spéciaux dans le Manuel de référence de Bash. Il y a toutes les variables d'environnement définies par le shell .

Pour un indice complet, veuillez consulter l' Index des variables du manuel de référence .

kojiro
la source
2
Ils sont tous documentés dans la bashpage de manuel. La seule bizarrerie est qu'elle $_n'est mentionnée que dans le cadre de son utilisation dans la MAILPATHvariable.
chepner
4
@chepner regarde man(1) bashsous Paramètres spéciaux pour le reste de la définition de $_.
kojiro
8
J'utilise à la !$place des $_scripts bash, car ce dernier échoue parfois.
amc
Belle liste kojiro. J'ai parcouru cette syntaxe $ {1 + "$ @"} qu'est-ce que cela signifie?
user178047
3
@amc: Voir unix.stackexchange.com/questions/271659/… pour les différences entre !$et $_.
tricasse
44
  • $_ 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. Google pour les variables spéciales bash.

Dan
la source
124
"Je l'ai fait. Ils m'ont envoyé ici." - Skit de librairie (doc officiel: gnu.org/software/bash/manual/bashref.html#Special-Parameters )
greggo
1
Je pense que $@c'est la chaîne et $*est la liste délimitée (selon la réponse acceptée ci-dessus, de toute façon).
RastaJedi
1
@RastaJedi: se "$@"développe en une liste, se "$*"développe en une seule chaîne. Le comportement spécial de $@s'applique lorsqu'il se trouve entre guillemets doubles.
Keith Thompson
6
Voté parce que ce n'est pas une réponse très complète ou utile. Dire "Google it" montre un manque d'effort, d'autant plus que la grande majorité des gens se retrouvent ici à partir de la recherche Google. Je pense que le moins que vous puissiez faire est d'ajouter des liens vers la documentation officielle. TBH, la seule raison pour laquelle je ne l'ai pas signalé pour suppression était parce que c'est au moins une réponse partielle à la question. Je sais qu'il est ancien, mais pensez à le modifier pour fournir plus de détails.
Sean the Bean
15

Pour aider à comprendre quoi faire $#, $0et $1, ..., $nfaire, 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
fedorqui 'SO arrête de nuire'
la source
4
Que signifie le! I dans votre boucle for? C'est en fait pourquoi je suis ici et je ne trouve aucune réponse nulle part parce que je ne sais pas comment l'appeler.
Anthony
7
@Anthony, cela s'appelle l' indirection variable . Vous pouvez trouver une bonne explantion de son utilisation dans bash: expansion indirecte, expliquez s'il vous plaît? .
fedorqui 'SO arrête de nuire'
3

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

#!/bin/bash

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

Production:

parameter 0 --> ./mytry.sh

Il s'agit d'une version actuelle (année 2016) de Bash, via Slackware 14.2

Adrian Cole
la source
5
Que $ 0 inclue ou non un chemin 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 (car le shell aura développé ~). Si vous avez fait ". Mytry.sh", vous verrez "bash".
Steve Folly