Расширение скобок с помощью переменной 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))}"
примечание:
eval
это зло- использование
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