52 votes

Comment assigner une expression glob à une variable dans un script de Bash ?

Lorsque les deux lignes de code suivantes sont exécutées dans un script bash, "ls" se plaint que les fichiers n'existent pas :

dirs=/content/{dev01,dev02}
ls -l $dirs

Lorsque j'exécute le script avec l'option -x, il semble passer la variable entre guillemets simples (ce qui empêcherait le globbing) :

+ dirs=/content/{dev01,dev01}
+ ls -l '/content/{dev01,dev01}'
ls: /content/{dev01,dev01}: No such file or directory

Si j'exécute la commande "ls" à partir de mon shell interactif (sans guillemets), elle renvoie les deux répertoires.

J'ai lu le manuel de référence de Bash (v 3.2) et je ne vois aucune raison pour que le globbing des noms de fichiers n'ait pas lieu (je ne passe pas -f à l'interpréteur de commandes), ou quoi que ce soit que je puisse définir pour m'assurer que le globbing a lieu.

2voto

gniourf_gniourf Points 9393

Puisque vous voulez glob des fichiers, vous ne devez pas utiliser les expansions d'accolades. L'utilisation de l'expansion des accolades dans ce cas est une anti-modèle et certainement le mauvais outil pour ce travail.

Ce que vous voulez, c'est globalisation étendue :

shopt -s extglob # likely already set in interactive shells

dirs=/content/@(dev01|dev02)
ls $dirs

0voto

Sam Liddicott Points 999

Le problème que personne n'a abordé est que l'affectation des variables fait la différence.

dirs=/content/{dev01,dev02}

se développe différemment de

echo /content/{dev01,dev02}

La question est de savoir comment attribuer les résultats de l'expansion à dirs

Ver: Comment utiliser la substitution Bash dans une déclaration de variable ?

-2voto

Zsolt Botykai Points 20615
ls `echo $dirs` 

fonctionne sous cygwin.

0 votes

Ne fonctionne pas dans GNU bash, version 3.2.17(1)-release (i386-apple-darwin9.0)

0 votes

C'est 3.2.39(20) sous cygwin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X