GNU/Linux >> Tutoriels Linux >  >> Linux

Expansion d'une variable Shell et effet de Glob et Split dessus ?

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 :

  1. Qu'est-ce que l'expansion variable ? dans unix/linux parler ?

Une seconde partie de ma question porte sur les termes suivants :

  1. glob
  2. 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.)

  1. Prenez la valeur de la variable, qui est une chaîne. Si la variable n'est pas définie, utilisez la chaîne vide.
  2. Si la construction inclut une transformation, appliquez-la. Par exemple, si la construction est ${VARIABLE#TEXT} , et la valeur de la variable commence par TEXT , supprimez TEXT depuis le début de la valeur.
  3. 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.
  4. 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.
  5. 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 :

  1. La valeur de la variable est la chaîne de 8 caractères a* b* c* .
  2. #?? signifie supprimer les deux premiers caractères, ce qui donne la chaîne de 6 caractères  b* c* (avec un espace initial).
  3. Si le développement se trouve dans un contexte de liste (c'est-à-dire pas entre guillemets doubles ou autre contexte similaire), continuez.
  4. Divisez la chaîne en mots délimités par des espaces, ce qui donne une liste de deux chaînes :b* et c* .
  5. La chaîne b* , interprété comme un motif, correspond à deux fichiers :bar et baz . La chaîne c* 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).

Connexe :Quoi NE PAS mettre sur un SSD ?

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 ?

Linux
  1. Différence entre le shell de connexion et le shell sans connexion ?

  2. Stockage de la sortie de la commande dans la variable Shell ?

  3. Comment obtenir la propre adresse IP et l'enregistrer dans une variable dans un script shell ?

  4. Quels shells ne prennent pas en charge l'expansion entre parenthèses en dollars et exigent des backticks ?

  5. Comment différer l'expansion variable ?

5 façons de diviser votre terminal Linux

Comment installer et utiliser Nu Shell sous Linux

Explication de la commande d'exportation sous Linux

Qu'est-ce que le sous-shell sous Linux ?

Portée variable pour les scripts shell bash et les fonctions dans le script

Différence entre '{}' et {} dans la commande find ?