bashbrace-expansion

Brace expansion with a Bash variable - {0..$foo}


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

gives me a folder called weekly.{0..4}

Is there a secret to curly brace expansion while creating folders I'm missing?


Solution

  • bash does brace expansion before variable expansion, so you get weekly.{0..4}.
    Because the result is predictable and safe (don't trust user input), you can use eval in your case:

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

    note:

    1. eval is evil
    2. use eval carefully

    Here, $((..)) is used to force the variable to be evaluated as an integer expression.