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

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

дает мне папку с именем еженедельно.{0..4}

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

5 ответов

Решение

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

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

примечание:

  1. eval это зло
  2. использование eval внимательно

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

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

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

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

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

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

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

,

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

пример

$ WEEKS_TO_SAVE=4
$ echo {0..$WEEKS_TO_SAVE}
0 1 2 3 4
Другие вопросы по тегам