Expansión de llaves con una variable Bash – {0 .. $ foo}

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

me da una carpeta llamada semanalmente. {0..4}

¿Existe un secreto para la expansión de llaves al crear carpetas que me falta?

bash brace expansion antes de la brace expansion variable expansion , por lo que obtienes weekly.{0..4} .
Como el resultado es predecible y seguro ( no confíe en la información del usuario ), puede usar eval en su caso:

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

nota :

  1. eval es malvado
  2. usa eval cuidadosamente

Aquí, $((..)) se usa para forzar que la variable se evalúe como una expresión entera.

Las llaves no soportan variables en BASH, puedes hacer esto:

  for (( c=0; c<=WEEKS_TO_SAVE; c++ )) do mkdir -p weekly.${c} done 

Otra forma de hacerlo sin evaluar y llamar a mkdir solo una vez:

 WEEKS_TO_SAVE=4 mkdir -p $(seq -f "weekly.%.0f" 0 $WEEKS_TO_SAVE) 

La expansión de la abrazadera no lo admite. Tendrás que hacerlo usando un bucle .

La expansión de corchetes se realiza antes que cualquier otra expansión, y los caracteres especiales de otras expansiones se conservan en el resultado. Es estrictamente textual. Bash no aplica ninguna interpretación sintáctica al contexto de la expansión o el texto entre las llaves. Para evitar conflictos con la expansión de parámetros, la cadena ‘$ {‘ no se considera elegible para la expansión de llaves

.

Si tiene zsh instalado en su caja, su código tal como está escrito funcionará con Z-shell si usa #!/bin/zsh como su intérprete:

Ejemplo

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