Ce post 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 citations autour des variables mais je ne comprends pas très bien ce que signifie l' expansion des variables en premier lieu. Ma première question est donc:
- Qu'est-ce que l' expansion variable sous Unix / Linux?
Une deuxième partie de ma question concerne 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 pas trouvé de réponses qui traitent directement du concept de globalisation et de fractionnement, mais utilisent plutôt ces termes directement pour répondre à d'autres questions comme celle- ci .
Réponses:
L'expansion variable (le terme standard est l' expansion des paramètres , et il est aussi parfois appelé substitution de variable ) signifie essentiellement remplacer la variable par sa valeur. Plus précisément, cela signifie remplacer la
$VARIABLE
construction (ou${VARIABLE}
ou${VARIABLE#TEXT}
ou d'autres constructions) par un autre texte qui est construit à partir de la valeur de la variable. Cet autre texte est l'expansion de la variable.Le processus d'expansion se déroule comme suit. (Je ne parle que du cas commun, certains paramètres et extensions du shell modifient le comportement.)
${VARIABLE#TEXT}
et que la valeur de la variable commence parTEXT
, supprimez-laTEXT
du début de la valeur.IFS
peut être modifiée pour se 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.Par exemple, supposons que la variable
foo
contiennea* b* c*
et que le répertoire courant contienne les fichiersbar
,baz
etpaz
.${foo#??}
Est ensuite développé comme suit: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).b*
etc*
.b*
, interprétée comme un modèle, correspond à deux fichiers:bar
etbaz
. La chaînec*
ne correspond à aucun fichier, elle est donc laissée seule. Le résultat est une liste de trois chaînes:bar
,baz
,c*
.Par exemple,
echo ${foo#??}
imprimebar baz c*
(la commandeecho
joint ses arguments avec un espace entre les deux).Pour plus de détails, voir:
la source
$var
) et d' autres types de paramètres comme$1
,$#
,$?
,$-
...glob / split
Je prends d'abord le glob / split. @ La réponse de Stéphane à laquelle vous avez lié est d'utiliser ces termes dans un sens général. Ce ne sont pas des commandes réelles ou quelque chose comme ça, juste des pseudo-opérations.
Le
split("$test")
diviserait le contenu de "$ test" en un "tableau" d'éléments.Le
glob(...)
prendrait alors soin de développer n'importe lequel de ces éléments contenant des caractères de globalisation du shell tels que*
ou des plages[1-2]
.Exemple
Disons que notre chaîne
$test
est la suivante.Disons également que nous avons un répertoire contenant quelques fichiers.
Maintenant, si nous essayons de l'écho sans guillemets, vous devriez remarquer que notre chaîne a été divisée en espaces, puis tous les caractères globulaires ont été développés.
Cependant, si nous devions citer la variable lorsque nous la transmettions comme argument,
echo
nous obtiendrions la chaîne littérale d'origine.expansion variable
Le terme expansion variable est destiné à couvrir l'opération de base que le shell effectue dans le cadre de ses opérations de base. Le shell est responsable de l'analyse de l'entrée, puis de l'exécution de cette entrée une fois qu'elle est jugée syntaxiquement correcte.
Dans notre exemple précédent. Lorsque la variable a
$test
été présentée commeecho
non citée, nous disions au shell d'aller de l'avant et de diviser ces arguments puis de les globaliser.Quand il a été cité, nous désactivions essentiellement cette fonctionnalité avec les variables que nous avons enveloppées de guillemets doubles.
Exemple
Voici quelques exemples supplémentaires de globbing et de split.
glob / split se produit automatiquement
glob / fractionnement désactivé via des guillemets doubles
la source