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))}"
примечание:
eval
это злоeval
осторожноЗдесь $((..))
используется для принудительного вычисления переменной как целочисленного выражения.
$(rm -rf /)
, или записывать в файл, включая >/etc/passwd
... если вы не используете eval
, и в этом случае эти данные анализируются как код.
- person Charles Duffy; 09.11.2015
$((..))
заставит его выполнять арифметическое расширение, но почему мы должны использовать $((WEEKS_TO_SAVE))
вместо простого $WEEKS_TO_SAVE
, что может $WEEKS_TO_SAVE
потенциально повредить
- person Oscar Zhang; 15.06.2020
Фигурные скобки не поддерживают переменные в 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-shell, если вы используете #!/bin/zsh
в качестве интерпретатора:
$ WEEKS_TO_SAVE=4
$ echo {0..$WEEKS_TO_SAVE}
0 1 2 3 4