WEEKS_TO_SAVE=4
mkdir -p weekly.{0..$WEEKS_TO_SAVE}
дает мне папку, называемую еженедельно. {0..4}
Есть ли секрет для расширения фигурных скобок при создании папок, которые мне не хватает?
WEEKS_TO_SAVE=4
mkdir -p weekly.{0..$WEEKS_TO_SAVE}
дает мне папку, называемую еженедельно. {0..4}
Есть ли секрет для расширения фигурных скобок при создании папок, которые мне не хватает?
bash
выполняется brace expansion
до variable expansion
, поэтому вы получаете weekly.{0..4}
.
Поскольку результат предсказуем и безопасен (Не доверять пользовательскому вводу), вы можете использовать eval
в вашем случае:
$ WEEKS_TO_SAVE=4
$ eval "mkdir -p weekly.{0..$((WEEKS_TO_SAVE))}"
note:
eval
is evileval
внимательноЗдесь $((..))
используется для принудительного вычисления переменной как целочисленного выражения.
В фигурных скобках не поддерживаются переменные в 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 не применяется синтаксическая интерпретация к контексту расширения или текста между фигурными скобками. к избегать конфликтов с расширением параметра, строка '$ {is not считается подходящим для расширения брекетов
.
Если у вас установлен zsh
на вашем поле, ваш код, как написано, будет работать с Z-shell, если вы используете #!/bin/zsh
как ваш интерпретатор:
$ WEEKS_TO_SAVE=4
$ echo {0..$WEEKS_TO_SAVE}
0 1 2 3 4