(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"