Я хочу использовать $var in
расширение скобки оболочки с диапазоном, в bash. Просто положить {$var1..$var2}
не работает, поэтому я пошел "боковой" ...
Следующее работает, но немного туповато.
# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments
Есть ли более "нормальный" способ?
shell
bash
brace-expansion
Peter.O
источник
источник
{$one..$three}
, потому что это недопустимая форма расширения скобки, которая в этом случае ожидает целые числа ... Она становится действительной формой только после расширения $ var, которыйeval
затем проходит через тот же процесс для генерации нормального расширения последовательности фигурных скобок ... 1 2 3 QED;) ... Резюме: простое присутствие пары фигурных скобок не вызывает расширение фигурных скобок ... только действительная форма запускает его ,a={0..9}; echo $a;
нет расширения скобки . Используяeval
, это работает. Поэтому я думаю, что объяснение @ mattdm это хорошо.Как вы уже поняли,
{1..3}
расширяется ,1 2 3
но{foo..bar}
и{$foo..$bar}
делать не в фигурных скобках триггера, а последний впоследствии расширен , чтобы заменить$foo
и$bar
их значениями.Откат на GNU (например, не встроенный Linux) - это
seq
команда.Еще одна возможность. если не
foo.
содержит специальный символ оболочки,Самое простое решение - использовать zsh, где
rm foo.{$ext0..$extN}
делает то, что вы хотите.источник
В то время как другие ответы обсуждают использование
eval
иseq
,bash
вы можете использовать традиционныйfor
цикл в стиле C в арифметическом контексте. Переменныеext0
иextN
раскрываются внутри,((..))
заставляя цикл работать в определенном диапазоне.Если вы ищете оптимальный способ и избегаете нескольких
rm
команд, вы можете использовать временный заполнитель для сохранения результатов имени файла и вызоваrm
в один прием.и теперь вызываем
rm
команду в расширенном массивеисточник
Заметки:
источник