Ce message contient en fait deux questions distinctes, mais je pense que les regrouper donnera un peu plus de contexte. J'ai parcouru cette question sur les guillemets autour des variables mais je ne comprends pas très bien ce qu'est l'expansion des variables signifie en premier lieu. Donc ma première question est :
- Qu'est-ce que l'expansion variable ? dans unix/linux parler ?
Une seconde partie de ma question porte sur les termes suivants :
- glob
- divisé
Que signifient les éléments ci-dessus et comment affectent-ils l'expansion variable ? La réponse à la question d'origine mentionne ce qui suit :
Considérez l'absence de guillemets (dans les contextes de liste) comme l'opérateur split+glob
.Comme si echo $test était echo glob(split("$test")).
Je n'ai trouvé aucune réponse qui aborde directement le concept de globbing et diviser mais utilise plutôt ces termes directement pour répondre à d'autres questions comme celle-ci.
Réponse acceptée :
Extension variable (le terme standard est expansion des paramètres , et on l'appelle aussi parfois substitution de variable ) signifie essentiellement remplacer la variable par sa valeur. Plus précisément, il s'agit de remplacer le $VARIABLE
construction (ou ${VARIABLE}
ou ${VARIABLE#TEXT}
ou d'autres constructions) par un autre texte construit à partir de la valeur de la variable. Cet autre texte est le développement de la variable.
Le processus d'expansion se déroule comme suit. (Je ne parle que du cas courant, certains paramètres du shell et certaines extensions modifient le comportement.)
- Prenez la valeur de la variable, qui est une chaîne. Si la variable n'est pas définie, utilisez la chaîne vide.
- Si la construction inclut une transformation, appliquez-la. Par exemple, si la construction est
${VARIABLE#TEXT}
, et la valeur de la variable commence parTEXT
, supprimezTEXT
depuis le début de la valeur. - Si le contexte nécessite un seul mot (par exemple entre guillemets doubles, ou dans la partie droite d'un devoir, ou à l'intérieur d'un document ici), arrêtez-vous ici. Sinon, passez aux étapes suivantes.
- Diviser la valeur en mots séparés à chaque séquence d'espaces. (La variable
IFS
peut être modifié pour diviser en caractères autres que les espaces.) Le résultat n'est donc plus une chaîne, mais une liste de chaînes. Cette liste peut être vide si la valeur ne contient que des espaces. - Traitez chaque élément de la liste comme un modèle générique de nom de fichier, c'est-à-dire un glob . Si le modèle correspond à certains fichiers, il est remplacé par la liste des noms de fichiers correspondants, sinon il est laissé tel quel.
Par exemple, supposons que la variable foo
contient a* b* c*
et le répertoire courant contient les fichiers bar
, baz
et paz
. Alors ${foo#??}
est développé comme suit :
- La valeur de la variable est la chaîne de 8 caractères
a* b* c*
. #??
signifie supprimer les deux premiers caractères, ce qui donne la chaîne de 6 caractèresb* c*
(avec un espace initial).- Si le développement se trouve dans un contexte de liste (c'est-à-dire pas entre guillemets doubles ou autre contexte similaire), continuez.
- Divisez la chaîne en mots délimités par des espaces, ce qui donne une liste de deux chaînes :
b*
etc*
. - La chaîne
b*
, interprété comme un motif, correspond à deux fichiers :bar
etbaz
. La chaînec*
ne correspond à aucun fichier, il est donc laissé seul. Le résultat est une liste de trois chaînes :bar
,baz
,c*
.
Par exemple echo ${foo#??}
affiche bar baz c*
(la commande echo
joint ses arguments avec un espace entre).
Pour plus de détails, voir :
- Extension des paramètres dans la norme POSIX, suivie de la division des champs et de l'extension des noms de chemin
- Extension des paramètres du shell dans le manuel bash, suivie de la division des mots et de l'extension des noms de fichiers
- $VAR vs ${VAR} et citer ou ne pas citer
- Quand les guillemets doubles sont-ils nécessaires ?