GNU/Linux >> Tutoriels Linux >  >> Linux

Expansion et variables des accolades Bash ?

Cette question a déjà des réponses ici :Puis-je utiliser des variables dans l'expansion {} sans `eval` ?

(3 réponses)
Fermé il y a 6 ans.

J'ai une commande de recherche :

find Directory/{Alpha,Bravo,Charlie} arg1 arg2

Je veux remplacer Alpha,Bravo,Charlie avec $find_dir

find Directory/{$find_dir} arg1 arg2

cependant ce dernier s'étend à

find Directory/{Alpha,Bravo,Charlie} arg1 arg2

plutôt alors

find Directory/Alpha Directory/Bravo Directory/Charlie arg1 arg2

Pourquoi? Cela fait partie d'un script bash assez complexe qui peut avoir plus ou moins de répertoires, pas tous pertinents (donc globuler Upload/* ne fonctionnerait pas). Donc, si j'en configure trois maintenant et que j'en ajoute un autre, je devrai l'ajouter manuellement plus tard. De plus, j'ai besoin qu'il s'exécute à partir de la racine des répertoires pour conserver la perspective des résultats des recherches (./Upload/Dir/file par opposition à ./Dir/file).

Mais l'utilisation d'une variable me permettrait de modifier cela au besoin et de le garder pertinent pour d'autres parties du script.

Réponse acceptée :

Depuis bash documentation, section Expansion de l'accolade :

L'extension des accolades est effectuée avant toute autre extension, et tous les
caractères spéciaux aux autres extensions sont conservés dans le résultat
. Il
est strictement textuel. Bash n'applique aucune interprétation syntaxique
au contexte de l'expansion ou du texte entre les accolades. Pour
éviter les conflits avec le développement des paramètres, la chaîne « ${ » n'est pas
considérée comme éligible pour le développement des accolades.

Une autre note, en bash :

L'ordre des développements est le suivant :développement d'accolades, développement de tilde,
développement de paramètres, variables et arithmétiques et substitution de commande (effectué de gauche à droite) , le fractionnement des mots et l'extension
des noms de fichiers.

Donc dans votre cas, bash vu l'expansion des accolades avant l'expansion de la variable, il fera d'abord l'expansion des accolades, produira le résultat {Alpha,Bravo,Charlie} .

Si vous pouvez contrôler $find_dir contenu variable, vous pouvez utiliser eval :

eval "find Directory/{$find_dir} arg1 arg2"

Linux
  1. Astuces Bash plus stupides :variables, recherche, descripteurs de fichiers et opérations à distance

  2. Comment différer l'expansion variable ?

  3. Est-ce que `~#` est une extension Tilde de Bash ?

  4. Comment trouver la longueur d'une chaîne dans Bash [Astuce rapide]

  5. rechercher et copier un fichier à l'aide de Bash

Bash Scripting - Variables expliquées avec des exemples

Variables "imbriquées" dans bash

Comprendre les variables dans Bash Shell sous Linux

Fonction bash pour trouver le plus récent modèle de correspondance de fichier

bash trouver des répertoires

Modifier de manière récursive les extensions de fichier dans Bash