Расширение скобок с помощью переменной Bash - {0 .. $ foo} - PullRequest
13 голосов
/ 18 февраля 2012
WEEKS_TO_SAVE=4
mkdir -p weekly.{0..$WEEKS_TO_SAVE}

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

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

Ответы [ 5 ]

10 голосов
/ 18 февраля 2012

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

WEEKS_TO_SAVE=4
mkdir -p $(seq -f "weekly.%.0f" 0 $WEEKS_TO_SAVE)
10 голосов
/ 18 февраля 2012

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 осторожно

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

10 голосов
/ 18 февраля 2012

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

 for (( c=0; c<=WEEKS_TO_SAVE; c++ ))
 do
    mkdir -p weekly.${c}
 done
2 голосов
/ 18 февраля 2012

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

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

.

1 голос
/ 18 февраля 2012

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

Пример

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