Ich möchte $var in
eine Shell-Klammer-Erweiterung mit einem Bereich in Bash verwenden. Einfach ausgedrückt {$var1..$var2}
funktioniert das nicht, also bin ich "seitlich" gegangen ...
Das Folgende funktioniert, aber es ist ein bisschen klug.
# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments
Gibt es einen "normaleren" Weg?
shell
bash
brace-expansion
Peter.O
quelle
quelle
{$one..$three}
, da es keine gültige Form der Klammererweiterung ist, die in diesem Fall Ganzzahlen erwartet ... Es wird erst nach der $ var-Erweiterung eine gültige Form. Diesereval
durchläuft dann denselben Prozess, um eine normale Klammersequenzerweiterung zu generieren ... 1 2 3 QED;) ... Zusammenfassung: Das einfache Vorhandensein eines Klammerpaars löst keine Klammererweiterung aus ... nur ein gültiges Formular löst dies aus .a={0..9}; echo $a;
gibt es keine geschweifte Klammer . Miteval
, es funktioniert. Ich finde die Erklärung von @ mattdm also gut.Wie Sie bereits realisiert,
{1..3}
dehnt sich1 2 3
aber{foo..bar}
oder{$foo..$bar}
nicht Auslöser Klammer Expansion und diese erweitert wird anschließend zu ersetzen$foo
und$bar
durch ihre Werte.Ein Fallback auf GNU (zB nicht eingebettetes Linux) ist der
seq
Befehl.Andere Möglichkeit. Wenn
foo.
keine Shell Sonderzeichen enthält, istDie einfachste Lösung ist, zsh zu verwenden, wo
rm foo.{$ext0..$extN}
Sie tun, was Sie wollen.quelle
Während die anderen Antworten diskutieren mit
eval
undseq
, inbash
, können Sie eine traditionelle C - Stil verwendenfor
Schleife in einem arithmetischen Kontext. Die Variablenext0
undextN
werden innerhalb((..))
des Bereichs erweitert, in dem die Schleife ausgeführt wird.Wenn Sie einen optimalen Weg suchen und mehrere
rm
Befehle vermeiden möchten, können Sie einen temporären Platzhalter verwenden, um die Dateinamenergebnisse zu speichern undrm
in einem Durchgang aufzurufen .Rufen Sie nun den
rm
Befehl im erweiterten Array aufquelle
Anmerkungen:
quelle