2017-10-04 5 views
0

Je voudrais remplacer la boucle suivante dans un de mes scripts bash:accolades mélange et globing est bash

for i in $(seq 1 $nb) do 
    grep -h 'my pattern' $mydir/$my_dir_prefix$i/$myfile_prefix* 
done 

par quelque chose comme:

grep -h 'my pattern' $mydir/$my_dir_prefix${1,$nb}/$myfile_prefix* 

mais il échoue ... En fonction là où j'essaie de mettre des guillemets doubles, j'obtiens des résultats différents mais jamais le bon.

Toutes les réponses J'ai vu autour de sujets similaires n'a pas résolu ce problème. Une idée?

+0

Les expansions d'accolades ne peuvent pas contenir de variables. – chepner

Répondre

0

Edit: Première solution ne fonctionnera que pour les numéros 1-9, en ajoutant meilleur

Regarder bash manual:

Une expression de séquence prend la forme {x..y [.. incr]}, où x et y sont soit des entiers, soit des caractères simples.

...

L'expansion des accolades est effectuée avant toute autre expansion

Donc, les variables sont littéralement traitées.

Solution 1. (fonctionne uniquement pour les numéros 1-9)

Mais vous devriez être en mesure d'utiliser [] glob votre but:

grep -h 'my pattern' $mydir/$my_dir_prefix[1-$nb]/$myfile_prefix* 

En ce qui concerne les guillemets doubles, vous pouvez ajouter les partout, mais pas autour de glob:

grep -h 'my pattern' "$mydir/$my_dir_prefix"[1-$nb]"/$myfile_prefix"* 

Solution 2.

Vous pouvez activer bash extglob option et utiliser la correspondance de modèle étendu:

shopt -s extglob 
grep -h grep -h 'my pattern' "$mydir/$my_dir_prefix"@($(seq -s \| 1 $nb))"/$myfile_prefix"* 
+0

Super, c'est exactement ce que je cherchais ... Je ne sais pas pourquoi je me suis concentré sur des accolades au lieu de tout faire avec les seules globes – leolivier

0

Il suffit de tirer le grep hors de la boucle:

grep -h 'my pattern' $(for i in $(seq 1 $nb); do find $mydir -wholename "$mydir/$my_dir_prefix$i/$myfile_prefix*"; done) 

Vous rencontrez des problèmes avec les fichiers weirdly nommés (par exemple contenant des retours à la ligne ou d'autres espaces), mais vous avez eu ces mêmes problèmes avec la solution originale.