Chcę użyć $var in
rozszerzenia nawiasów klamrowych z zakresem, w bash. Po prostu stawianie {$var1..$var2}
nie działa, więc poszedłem „bocznie” ...
Poniższe działa, ale jest trochę kludgey.
# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments
Czy istnieje bardziej „normalny” sposób?
shell
bash
brace-expansion
Peter.O
źródło
źródło
{$one..$three}
, ponieważ nie jest poprawnym forma Brace-ekspansji, który w tym przypadku oczekuje całkowitymi ... Staje się tylko ważna forma po rozszerzeniu $ var, któryeval
następnie przechodzi przez ten sam proces, aby wygenerować normalne rozwinięcie sekwencji nawiasów ... 1 2 3 QED;) ... Podsumowanie: prosta obecność pary nawiasów klamrowych nie powoduje rozszerzenia nawiasów klamrowych ... wyzwala go tylko poprawna forma .a={0..9}; echo $a;
brak rozszerzenia nawiasów klamrowych . Korzystanieeval
, to działa. Myślę więc, że wyjaśnienie @ mattdm jest dobre.Jak już sobie sprawę,
{1..3}
rozszerza się1 2 3
, ale{foo..bar}
czy{$foo..$bar}
nie wyzwalają rozwijanie nawiasów, a ten ostatni jest następnie rozszerzony w celu zastąpienia$foo
i$bar
ich wartości.Powrót do GNU (np. Niewbudowany Linux) to
seq
polecenie.Inna możliwość. jeśli
foo.
nie zawiera znaku specjalnego powłoki, toNajprostszym rozwiązaniem jest użycie zsh, gdzie
rm foo.{$ext0..$extN}
robi to, co chcesz.źródło
Podczas gdy inne odpowiedzi omawiają użycie
eval
iseq
,bash
możesz użyć tradycyjnejfor
pętli w stylu C w kontekście arytmetycznym. Zmienneext0
iextN
są rozwinięte wewnątrz,((..))
powodując uruchomienie pętli dla zdefiniowanego zakresu.Jeśli szukasz optymalnego sposobu i unikniesz wielu
rm
poleceń, możesz użyć tymczasowego symbolu zastępczego, aby zapisać wyniki nazwy pliku i zadzwonićrm
za jednym razem.i teraz wywołaj
rm
polecenie w rozszerzonej tablicyźródło
Uwagi:
źródło