Je veux utiliser $var in
une extension de coque shell avec une plage, en bash. Mettre simplement {$var1..$var2}
ne fonctionne pas, alors je suis allé "latéralement" ...
Ce qui suit fonctionne, mais c'est un peu kludgey.
# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments
Y a-t-il une manière plus "normale"?
shell
bash
brace-expansion
Peter.O
la source
la source
{$one..$three}
, car ce n'est pas une forme d'expansion d'accolade valide, qui dans ce cas attend des entiers ... Elle ne devient une forme valide qu'après l'expansion de $ var, quieval
passe ensuite par le même processus pour générer un développement de séquence d’accolade normal ... 1 2 3 QED;) ... Résumé: la simple présence d’une paire d’accolade ne déclenche pas le développement de l’accolade ... seule une forme valide le déclenche .a={0..9}; echo $a;
il n’y a pas d’ extension d’accolade . En utilisanteval
, ça marche. Je pense donc que l'explication de @ mattdm est bonne.Comme vous vous êtes déjà rendu compte,
{1..3}
s’agrandit1 2 3
mais ne déclenche pas{foo..bar}
ou{$foo..$bar}
ne développe pas l’accolade. Cette dernière est ensuite étendue pour remplacer$foo
et$bar
par leurs valeurs.Un repli sur GNU (par exemple, Linux non intégré) est la
seq
commande.Une autre possibilité. si
foo.
ne contient aucun caractère spécial de shell, estLa solution la plus simple consiste à utiliser zsh, d'où
rm foo.{$ext0..$extN}
vient ce que vous voulez.la source
Tandis que les autres réponses expliquent comment utiliser
eval
etseq
, dansbash
, vous pouvez utiliser unefor
boucle de style C traditionnelle dans un contexte arithmétique. Les variablesext0
etextN
sont développées à l'intérieur, ce qui((..))
provoque l'exécution de la boucle pour la plage définie.Si vous recherchez un moyen optimal et évitez les multiples
rm
commandes , vous pouvez utiliser un espace réservé temporaire pour stocker les résultats du nom de fichier et appelerrm
one-shot.et maintenant appeler la
rm
commande sur le tableau développéla source
Remarques:
la source