Расширение скобки с переменной Bash - {0.. $foo}

WEEKS_TO_SAVE=4
mkdir -p weekly.{0..$WEEKS_TO_SAVE}

дает мне папку, называемую еженедельно. {0..4}

Есть ли секрет для расширения фигурных скобок при создании папок, которые мне не хватает?

Ответ 1

bash выполняется brace expansion до variable expansion, поэтому вы получаете weekly.{0..4}.
Поскольку результат предсказуем и безопасен (Не доверять пользовательскому вводу), вы можете использовать eval в вашем случае:

$ WEEKS_TO_SAVE=4
$ eval "mkdir -p weekly.{0..$((WEEKS_TO_SAVE))}"

note:

  • eval is evil
  • используйте eval внимательно

Здесь $((..)) используется для принудительного вычисления переменной как целочисленного выражения.

Ответ 2

В фигурных скобках не поддерживаются переменные в BASH, вы можете сделать это:

 for (( c=0; c<=WEEKS_TO_SAVE; c++ ))
 do
    mkdir -p weekly.${c}
 done

Ответ 3

Другой способ сделать это без eval и вызова mkdir только один раз:

WEEKS_TO_SAVE=4
mkdir -p $(seq -f "weekly.%.0f" 0 $WEEKS_TO_SAVE)

Ответ 4

Расширение брекета не поддерживает его. Вам нужно будет сделать это с помощью цикла .

Расширение скобки выполняется перед любыми другими расширениями, и любое в результате сохраняются символы, специальные для других расширений. Это является строго текстовым. Bash не применяется синтаксическая интерпретация к контексту расширения или текста между фигурными скобками. к избегать конфликтов с расширением параметра, строка '$ {is not считается подходящим для расширения брекетов

.

Ответ 5

Если у вас установлен zsh на вашем поле, ваш код, как написано, будет работать с Z-shell, если вы используете #!/bin/zsh как ваш интерпретатор:

Пример

$ WEEKS_TO_SAVE=4
$ echo {0..$WEEKS_TO_SAVE}
0 1 2 3 4